XML 使用 XML 代码注释的数组序列化
XML Array Serialization Using XML Code Annotations
我正在努力序列化以下 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 属性和字符串值列表。我也不确定我需要制作哪些 classes 才能完成这项工作。有什么建议吗?
备注
我也尝试过使用 'Special Paste' 选项来生成 class 结构,但是在序列化并立即反序列化之后,输出的 xml 文件不是相同的结构。
以下适合我。
类用于序列化和反序列化:
[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>
我正在努力序列化以下 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 属性和字符串值列表。我也不确定我需要制作哪些 classes 才能完成这项工作。有什么建议吗?
备注 我也尝试过使用 'Special Paste' 选项来生成 class 结构,但是在序列化并立即反序列化之后,输出的 xml 文件不是相同的结构。
以下适合我。
类用于序列化和反序列化:
[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>