如何将属性添加到标记为XmlArrayAttribute的集合中?

时间:2010-11-19 18:42:00

标签: c# .net xml xml-serialization

我有一个格式如下的XML:http://pastie.org/1311506(因为注释解析器删除了标签,所以不在此处插入)。

使用以下代码对此XML进行了实现/反序列化:

[XmlRoot("products")]
public class Products
{
    [XmlElement("label")]
    public string Label { get; set; }

    [XmlArray("cars")]
    [XmlArrayItem("car")]
    public Car[] Cars { get; set; }
}

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

...

var products = new Products
                   {
                       Label = "1",
                       Cars = new[]
                                  {
                                      new Car {Name = "BMW"},
                                      new Car {Name = "Volvo"}
                                  }
                   };
var serializer = new XmlSerializer(typeof(Products));
var writer = new StringWriter();
serializer.Serialize(writer, products);
Console.WriteLine(writer);

我需要一个名为<cars>的{​​{1}}节点的附加属性(如此处:http://pastie.org/1311514)。我该怎么办?

换句话说,如何定义数据类(Products和Car以及其他可能的必要)以解析第二个pastie链接中显示的格式的XML?

1 个答案:

答案 0 :(得分:4)

没有简单的方法可以做到这一点,因为对于集合,XmlSerializer忽略所有成员,它只序列化集合的项目。但是,如果您只想反序列化它并忽略type属性,那么这不是问题:将忽略未知属性。

如果需要获取type的值,可以声明一个不是集合但包含集合的类。这样的事情:

public class Cars
{
    [XmlElement("car")]
    public Car[] Items { get; set; }

    [XmlAttribute("type")]
    public string Type { get; set; }
}

Products课程中,只需使用Cars属性声明Cars类型的XmlElement属性:

[XmlRoot("products")]
public class Products
{
    [XmlElement("label")]
    public string Label { get; set; }

    [XmlElement("cars")]
    public Cars Cars { get; set; }
}