了解根元素在xml反序列化中的重要性

时间:2018-12-04 20:06:48

标签: c# xmlserializer xml-deserialization

我有如下所示的XML:

<feed>
  <products>
    <product>
    </product>
    .
    .
    .
    <product>
    </product>
  </products>
</feed>

我可以使用以下方法反序列化xml:

public class feed
{
    public ProductList products { get; set; }
}

public class ProductList
{
    [XmlElement("product")]
    public List<Product> Products { get; set; }
}

var result = (feed)new XmlSerializer(typeof(feed)).Deserialize(xmlReader);

我认为我可以使用XML根属性来控制反序列化,即

class Products
{
   public List<Product> Products { get; set; }
}

var rootAtrr = new XmlRootAttribute("products");
var result = (Products)new XmlSerializer(typeof(Products), rootAtrr).Deserialize(xmlReader);

或更妙的是:

var result = (List<Product>)new XmlSerializer(typeof(List<Product>), rootAtrr).Deserialize(xmlReader);

以上所有更改均无效。

这是否意味着root属性专用于XML中的ACTUAL根元素,而不是从哪里开始读取?

此外,这是否意味着XML文档强制执行要定义的模型类? feed类在这种特殊情况下?

还是我遗漏了1分或3分?

1 个答案:

答案 0 :(得分:1)

XML术语中的“根元素”表示XML文档的顶级元素。 XmlRootAttribute指示XmlSerializer的类如何与XML文档的根元素进行映射。

例如,如果XML根元素应具有标签名feed,但是您宁愿将类命名为SerializedFeed,则可以使用XmlRootAttribute,如下所示:

[XmlRoot("feed")]
public class SerializedFeed
{
    [XmlArray("products")]
    [XmlArrayItem("product")]
    public List<Product> products { get; set; }
}

public class Product {
    [XmlAttribute("name")]
    public string Name {get; set;}
}

并像这样读取XML:

var xml = @"<feed>
  <products>
    <product name=""A"" />
    <product name=""B"" />    
  </products>
</feed>";
var serializer = new XmlSerializer(typeof(SerializedFeed)); 
var feed = (SerializedFeed)serializer.Deserialize(new StringReader(xml));

使用XmlSerializer时,您的类层次结构应与XML文档匹配。如果没有,根据我的经验,您将无所不用其极,并且使用XmlReader / XmlWriter API编写自己的序列化器/反序列化器会更容易。