【问题标题】:XML Array Serialization Using XML Code Annotations使用 XML 代码注释的 XML 数组序列化
【发布时间】:2019-01-28 21:49:36
【问题描述】:

我正在努力序列化以下 XML 代码...

<Activity mc:Ignorable="sap sap2010 sads" x:Class="Main"
 xmlns="http://schemas.microsoft.com/netfx/2009/xaml/activities"
 xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
 xmlns:sco="clr-namespace:System.Collections.ObjectModel;assembly=mscorlib"
 xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">
<TextExpression.NamespacesForImplementation>
    <sco:Collection x:TypeArguments="x:String">
      <x:String>System.Activities</x:String>
      <x:String>System.Activities.Statements</x:String>
      <x:String>System.Activities.Expressions</x:String>
      <x:String>System.Activities.Validation</x:String>
      <x:String>System.Activities.XamlIntegration</x:String>
      <x:String>Microsoft.VisualBasic</x:String>
      <x:String>Microsoft.VisualBasic.Activities</x:String>
      <x:String>System</x:String>
      <x:String>System.Collections</x:String>
      <x:String>System.Collections.Generic</x:String>
      <x:String>System.Data</x:String>
      <x:String>System.Diagnostics</x:String>
      <x:String>System.Drawing</x:String>
      <x:String>System.IO</x:String>
      <x:String>System.Linq</x:String>
      <x:String>System.Net.Mail</x:String>
      <x:String>System.Xml</x:String>
      <x:String>System.Xml.Linq</x:String>
      <x:String>UiPath.Core</x:String>
      <x:String>System.Windows.Markup</x:String>
      <x:String>UiPath.Core.Activities</x:String>
    </sco:Collection>
  </TextExpression.NamespacesForImplementation>
</Activity>

我觉得我已经在各种属性上尝试了 [XmlArray] 和 [XmlArrayItem] 的所有组合,但我似乎可以同时捕获 TypeArguments 属性和字符串值列表。我也不确定我需要制作哪些课程才能完成这项工作。有什么建议吗?

注意 我也尝试过使用“特殊粘贴”选项来生成类结构,但是在序列化并立即反序列化之后,输出的 xml 文件的结构不同。

【问题讨论】:

  • 你有 Visual Studio 2012+ 吗?如果是这样,请尝试this answer 中的方法 2。如果没有,请尝试方法 1 :)
  • @LewsTherin 我这样做了,我也试过了。由于某种原因,似乎完全忽略了 XML 文件的这一部分!因此,我不得不手动尝试。
  • 您是否通过 XML 验证器运行 XML?如果 XML 无效,这两种方法将无法正常工作。
  • 你能展示更多你的 xml(比如命名空间,并使其成为有效的 XML)吗?这样,我们可以尝试重现您的问题。
  • @Flydog57 当然可以。我会将它添加到原始帖子中。我还验证了这是有效的 xml。

标签: c# xml serialization xmlserializer


【解决方案1】:

以下对我有用。

用于序列化和反序列化的类:

[XmlRoot(Namespace = "http://schemas.microsoft.com/netfx/2009/xaml/activities")]
public class Activity
{
    [XmlAttribute(Namespace = "http://schemas.microsoft.com/netfx/2009/xaml/activities")]
    public string Ignorable { get; set; }

    [XmlAttribute(Namespace = "http://schemas.microsoft.com/winfx/2006/xaml")]
    public string Class { get; set; }

    [XmlElement("TextExpression.NamespacesForImplementation")]
    public NamespacesForImplementation NamespacesForImplementation { get; set; }
}

public class NamespacesForImplementation
{
    [XmlElement(Namespace = "clr-namespace:System.Collections.ObjectModel;assembly=mscorlib")]
    public NamespaceCollection Collection { get; set; }
}

public class NamespaceCollection
{
    [XmlAttribute(Namespace = "http://schemas.microsoft.com/winfx/2006/xaml")]
    public string TypeArguments { get; set; }

    [XmlElement(ElementName = "String", Namespace = "http://schemas.microsoft.com/winfx/2006/xaml")]
    public List<string> Content { get; set; }
}

在您的问题中序列化确切 XML 的测试程序:

class Program
{
    static void Main(string[] args)
    {
        var serializer = new XmlSerializer(typeof(Activity));

        Activity activity;
        using (var stream = File.OpenText("Test.xml"))
        {
            activity = (Activity) serializer.Deserialize(stream);
        }

        XmlSerializerNamespaces ns = new XmlSerializerNamespaces();
        ns.Add(string.Empty, "http://schemas.microsoft.com/netfx/2009/xaml/activities");
        ns.Add("mc", "http://schemas.openxmlformats.org/markup-compatibility/2006");
        ns.Add("sco", "clr-namespace:System.Collections.ObjectModel;assembly=mscorlib");
        ns.Add("x", "http://schemas.microsoft.com/winfx/2006/xaml");

        using (var stringWriter = new StringWriter())
        {
            serializer.Serialize(stringWriter, activity, ns);
            Console.WriteLine(stringWriter.ToString());
        }
    }
}

程序的输出如下:

<?xml version="1.0" encoding="utf-16"?>
<Activity xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:sco="clr-namespace:System.Collections.ObjectModel;assembly=mscorlib" xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" x:Class="Main" xmlns="http://schemas.microsoft.com/netfx/2009/xaml/activities">
  <TextExpression.NamespacesForImplementation>
    <sco:Collection x:TypeArguments="x:String">
      <x:String>System.Activities</x:String>
      <x:String>System.Activities.Statements</x:String>
      <x:String>System.Activities.Expressions</x:String>
      <x:String>System.Activities.Validation</x:String>
      <x:String>System.Activities.XamlIntegration</x:String>
      <x:String>Microsoft.VisualBasic</x:String>
      <x:String>Microsoft.VisualBasic.Activities</x:String>
      <x:String>System</x:String>
      <x:String>System.Collections</x:String>
      <x:String>System.Collections.Generic</x:String>
      <x:String>System.Data</x:String>
      <x:String>System.Diagnostics</x:String>
      <x:String>System.Drawing</x:String>
      <x:String>System.IO</x:String>
      <x:String>System.Linq</x:String>
      <x:String>System.Net.Mail</x:String>
      <x:String>System.Xml</x:String>
      <x:String>System.Xml.Linq</x:String>
      <x:String>UiPath.Core</x:String>
      <x:String>System.Windows.Markup</x:String>
      <x:String>UiPath.Core.Activities</x:String>
    </sco:Collection>
  </TextExpression.NamespacesForImplementation>
</Activity>

【讨论】:

  • 非常感谢,这对我有用 :D 这也让我能够识别我的错误:我一直尝试在 List&lt;string&gt; 上使用 [XmlArray][XmlArrayItem] 而不是 [XmlElement] .
  • 非常漂亮。我想知道和@unknownpresense 走的是同一条路,但这无济于事。我正要建议在 Collection 类上手动实现IXmlSerializable。这是所以更好的解决方案。
猜你喜欢
  • 1970-01-01
  • 2020-04-11
  • 1970-01-01
  • 2011-04-20
  • 2012-07-26
  • 2015-01-06
  • 2014-07-01
  • 1970-01-01
相关资源
最近更新 更多