序列化c#中不包含的XML数组

本文关键字:XML 数组 包含 序列化 | 更新日期: 2023-09-27 18:06:22

我正在开发一个应用程序,需要反序列化一个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,但这很麻烦。知道为什么不行吗?

序列化c#中不包含的XML数组

一个鲜为人知的秘密似乎是Visual Studio附带的XSD.exe实用程序。在它可以做的其他事情中,有两个特性是您需要的:

从XML文件生成XSD

c:'>xsd myfile.xml

这将从XML中推断出XSD并将其输出到磁盘上。然后你可以取

从XSD文件生成c#类

c:'>xsd myfile.xsd /classes

这将生成一系列带有所有必要的序列化属性的c#类。您不必直接使用它们,但是您可以确定。net期望的是什么。

完成这项工作的第一步是创建一些示例实例并对它们进行序列化。如果输出符合您的xml,就可以将其读取回去了。这通常是把所有碎片拼凑在一起的最简单的方法。但是数组,列表,…有时真的很棘手。如果您被迫使用某种模式,有时对类的某些部分实现可序列化是有帮助的。这样,您可以对关键部分进行微调,但可以享受其他部分的默认xml序列化。

对于您在问题中提供的示例xml内容,可以这样做:

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

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