序列化XML无节制阵列
我就需要反序列化,看起来像这样的XML文档的应用程序工作:序列化XML无节制阵列
<results>
<item ...>
</item>
<item ...>
</item>
<item ...>
</item>
...
</results>
所以我已经设置了一个对象模型是这样的:
[XmlRoot("results")]
public class Results
{
[XmlArray("item")]
[XmlArrayItem("item", typeof(Item))]
public List<Item> Items { get; set; }
}
public class Item
{
[XmlElement("name")]
public string Name { get; set; }
[XmlElement("description")]
public string Description { get; set; }
. . .
}
我已经尝试了许多变体,如何声明和注解Items集合,但是无论我从未在该集合中获取任何项目。 .NET中是否存在反序列化不包含在公共父元素中的数组的问题(即,本示例中可能包含的内容)?
我无法控制这个XML的格式,所以我必须让它按原样工作。我目前正在使用XDocument/XElement/XAttribute来手动读取和解析XML,但这很痛苦。任何想法为什么这不起作用?
在此先感谢。
一个鲜为人知的秘密似乎是随Visual Studio一起提供的XSD.exe utility。在其他方面可以做,你将需要两个特点:
从XML文件
c:\>xsd myfile.xml
生成一个XSD这将从XML推断XSD吐出来在磁盘上。然后你就可以采取和:
生成XSD文件
c:\>xsd myfile.xsd /classes
这将产生所有必要的系列化一系列的C#类的C#类对他们的属性。你不必直接使用它们,但是你一定可以弄清楚.Net期待的是什么。
做这样的工作时,我的第一步是创建一些示例实例并对它们进行序列化。如果输出适合你的XML,你准备好读回来。这通常是最简单的方法,让所有的朋友聚在一起。但是数组,列表......有时候真的很棘手。如果你*拥有一个特定的模式,那么为你的类的某些部分实现ISerializable有时会很有帮助。通过这种方式,您可以微调批评修饰,但可以享受其他部分的默认xml序列化。
对于你在你的问题中提供的示例XML的内容,这将做到这一点:
[XmlRoot("results")]
public class Results
{
[XmlElement("item")]
public List<Item> Items { get; set; }
}
它涵盖了在没有外部因素,因为可能被命名为例如“项目”的情况。
啊,我认为它必须注释为一个数组。我会试试这个,但上面的解决方案非常优雅,我只能这样做。谢谢你的回应。 – lje
感谢您的回复。我能够用这种方法正确地反序列化一切。十分优雅。 – lje