在文档根处反序列化XML数组

8

关于使用.Net进行XML序列化的又一个问题。

我从第三方接收到一个XML字符串,想要将其解析成一个.Net类,尽可能地减少麻烦。我不想使用xsd,因为我的XML非常简单,我也不喜欢它生成的冗长类。我已经掌握了反序列化的基础知识,但在处理根级别数组时遇到了困难。

以下是问题XML:

<people>
  <person>
    <id>1234</id>
  </person>
  <person>
    <id>4567</id>
  </person>
 </people>

我该如何映射我的C# People类的属性以进行反序列化?

以下是我想要工作的代码,但它并没有起作用。

[Serializable()]
[XmlRootAttribute("people", Namespace = "", IsNullable = false)]
public class People
{
    [XmlArrayItem(typeof(Person), ElementName = "person")]
    public List<Person> Persons;
}

如果我篡改XML为:

<result>
  <people>
    <person>
      <id>1234</id>
    </person>
    <person>
      <id>4567</id>
    </person>
   </people>
 </result>

下面的类定义可以让它工作,但感觉很不对。

[Serializable()]
[XmlRootAttribute("result", Namespace = "", IsNullable = false)]
public class People
{
    [XmlArray(ElementName = "people")]
    [XmlArrayItem(typeof(Person), ElementName = "person")]
    public List<Person> Persons;
}

你不需要[Serializable],顺便说一下 - 它不被XmlSerializer使用。 - Marc Gravell
1个回答

9
[XmlElement("person")]
public List<Person> Persons;

尽管实际上我更喜欢:
private List<Person> persons;
[XmlElement("person")]
public List<Person> Persons {get{return persons??(persons=new List<Person>());}}

由于这个功能:

  • 可以延迟创建列表,在您不需要人员时使用
  • 列表属性没有"set"(它是不必要的)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接