我有如下所示的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分?
答案 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编写自己的序列化器/反序列化器会更容易。