2011-08-23 49 views
0

我就需要反序列化,看起来像这样的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,但这很痛苦。任何想法为什么这不起作用?

在此先感谢。

回答

1

一个鲜为人知的秘密似乎是随Visual Studio一起提供的XSD.exe utility。在其他方面可以做,你将需要两个特点:

从XML文件

c:\>xsd myfile.xml 

生成一个XSD这将从XML推断XSD吐出来在磁盘上。然后你就可以采取和:

生成XSD文件

c:\>xsd myfile.xsd /classes 

这将产生所有必要的系列化一系列的C#类的C#类对他们的属性。你不必直接使用它们,但是你一定可以弄清楚.Net期待的是什么。

+0

感谢您的回复。我能够用这种方法正确地反序列化一切。十分优雅。 – lje

1

做这样的工作时,我的第一步是创建一些示例实例并对它们进行序列化。如果输出适合你的XML,你准备好读回来。这通常是最简单的方法,让所有的朋友聚在一起。但是数组,列表......有时候真的很棘手。如果你被迫拥有一个特定的模式,那么为你的类的某些部分实现ISerializable有时会很有帮助。通过这种方式,您可以微调批评修饰,但可以享受其他部分的默认xml序列化。

1

对于你在你的问题中提供的示例XML的内容,这将做到这一点:

[XmlRoot("results")] 
public class Results 
{ 
    [XmlElement("item")] 
    public List<Item> Items { get; set; } 
} 

它涵盖了在没有外部因素,因为可能被命名为例如“项目”的情况。

+0

啊,我认为它必须注释为一个数组。我会试试这个,但上面的解决方案非常优雅,我只能这样做。谢谢你的回应。 – lje