【问题标题】:Understanding the significance of root element in xml deserialization理解xml反序列化中根元素的意义
【发布时间】:2018-12-04 20:06:47
【问题描述】:

我有如下 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);

以上所有更改均无效。

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

另外,这是否意味着 XML 文档强制定义什么模型类?在这种特殊情况下feed 类?

或者我错过了 1 分还是 3 分?

【问题讨论】:

    标签: c# xmlserializer xml-deserialization


    【解决方案1】:

    XML 术语中的“根元素”是指 XML 文档的顶级元素。 XmlRootAttribute 指示 XmlSerializer 您的类如何映射到 XML 文档的根元素/从 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 编写自己的序列化器/反序列化器会更容易。

    【讨论】:

      猜你喜欢
      • 2017-01-10
      • 2011-06-24
      • 1970-01-01
      • 1970-01-01
      • 2015-04-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多