Bum*_*per 5 c# xml xml-serialization xml-deserialization xmlserializer
我有以下xml:
<Applications>
<AccessibleApplication></AccessibleApplication>
<AccessibleApplication></AccessibleApplication>
<EligibleApplication></EligibleApplication>
<EligibleApplication></EligibleApplication>
</Applications>
Run Code Online (Sandbox Code Playgroud)
有没有办法将其反序列化为 C# 对象,以便 AccessibleApplications 和 EligibleApplications 是两个单独的数组?我尝试了以下但得到一个例外,因为“应用程序”被使用了不止一次。
[XmlArray("Applications")]
[XmlArrayItem("AccessibleApplication")]
public List<Application> AccessibleApplications { get; set; }
[XmlArray("Applications")]
[XmlArrayItem("EligibleApplication")]
public List<Application> EligibleApplications { get; set; }
Run Code Online (Sandbox Code Playgroud)
例外情况是:来自命名空间 '' 的 XML 元素 'Applications' 已经存在于当前作用域中。使用 XML 属性为元素指定另一个 XML 名称或命名空间。
这是可能的吗?
谢谢!
编辑:我忘了提到我不想仅仅为了为两个数组提供容器对象而拥有一个“应用程序”类。我有几种这样的情况,我不希望这些类的混乱,它们的唯一目的是拆分两个相同类型的数组。
我希望能够使用诸如 [XmlArrayItem="Application/AccessibleApplication"] 之类的某种标记将两个数组反序列化为外部对象,而无需创建“应用程序”类。
我找到了一个相当巧妙的方法来做到这一点,首先创建一个这样的类:
using System.Xml.Serialization;
[XmlRoot]
public class Applications
{
[XmlElement]
public string[] AccessibleApplication;
[XmlElement]
public string[] EligibleApplication;
}
Run Code Online (Sandbox Code Playgroud)
请注意元素是如何成为单独的数组的。现在使用这个类(我将 XML 放在一个单独的文件中,因此是 XmlDocument 类)。
var doc = new XmlDocument();
doc.Load("../../Apps.xml");
var serializer = new XmlSerializer(typeof(Applications));
Applications result;
using (TextReader reader = new StringReader(doc.InnerXml))
{
result = (Applications)serializer.Deserialize(reader);
}
Run Code Online (Sandbox Code Playgroud)
现在,为了证明这是有效的,您可以将所有内容写入控制台应用程序并执行 foreach 来打印数组中的所有值,如下所示:
foreach (var app in result.AccessibleApplication)
{
Console.WriteLine(app);
}
foreach (var app in result.EligibleApplication)
{
Console.WriteLine(app);
}
Run Code Online (Sandbox Code Playgroud)