在C#中序列化XML非包含数组

时间:2011-08-23 17:01:47

标签: c# xml serialization

我正在开发一个需要反序列化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,但这很痛苦。任何想法为什么这不起作用?

提前致谢。

3 个答案:

答案 0 :(得分:1)

执行此类工作时,我的第一步是创建一些示例实例并对其进行序列化。如果输出适合您的xml,您可以回读它。这通常是将所有弊端放在一起的最简单方法。但阵列,列表......有时候真的很棘手。如果您被迫拥有某个模式,那么为类的某些部分实现ISerializable有时会很有帮助。通过这种方式,您可以对其他部分的默认xml序列化进行微调。但

答案 1 :(得分:1)

一个鲜为人知的秘密似乎是Visual Studio附带的XSD.exe utility。它可以做的其他事情,你需要的两个功能:

从XML文件生成XSD

c:\>xsd myfile.xml

这将从您的XML推断出XSD并将其吐出磁盘。然后您可以采取以下措施:

从XSD文件生成C#类

c:\>xsd myfile.xsd /classes

这将生成一系列C#类,其中包含所有必需的序列化属性。您不必直接使用它们,但您当然可以弄清楚.Net的期望是什么。

答案 2 :(得分:1)

关于您在问题中提供的示例xml内容,这将执行此操作:

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

它涵盖了没有外部元素的情况,例如可以命名为“items”。