首页 > 解决方案 > 如何将重复的 XML 元素序列化为数组?

问题描述

我正在尝试序列化一些格式不正确的 XML。我特别在将重复元素转换为数组时遇到问题。

在通常情况下,这样的事情会很好地序列化

班级

public class Animal
{
    [XmlArray("Dogs")]
    [XmlArrayItem("Dog", typeof(Dog))]
    public Dog[] Dogs {get;set;}
}

XML

<Animals>
    <Dogs>
        <Dog>
            <Name>Spot</Name>
            <Age>5</Age>
        </Dog>
        <Dog>
            <Name>Spike</Name>
            <Age>2</Age>
        </Dog>
        <Dog>
            <Name>Arnold</Name>
            <Age>7</Age>
        </Dog>
    </Dogs>
</Animals>

实际上,XML 的结构如下

<Animals>
    <Dog>
        <Name>Spot</Name>
        <Age>5</Age>
    </Dog>
    <Dog>
        <Name>Spike</Name>
        <Age>2</Age>
    </Dog>
    <Dog>
        <Name>Arnold</Name>
        <Age>7</Age>
    </Dog>
</Animals>

我可以将这些属性序列化为数组的最简单方法是什么?

标签: c#.netxmlasp.net-corexml-serialization

解决方案


该问题不包含序列化方法的代码。无论如何,当使用以下序列化方法时,上述 XML 标记应该可以工作:

public class Animals
{
    [XmlArray("Dogs")]
    [XmlArrayItem("Dog", typeof(Dog))]
    public Dog[] Dogs { get; set; }
}

public static string SerializeToXml(object o)
{          
    var ns = new XmlSerializerNamespaces(new[] { Ident=true, XmlQualifiedName.Empty });
    using (var stream = new StringWriter())
    using (var writer = XmlWriter.Create(stream, new XmlWriterSettings { OmitXmlDeclaration = true }))
    {
        var serializer = new XmlSerializer(typeof(Animals));
        serializer.Serialize(writer, o, ns);
        return stream.ToString();
    }
}

测试代码

var animals = new Animals()
    {
        Dogs = new Dog[] { new Dog { Name = "dog1", Age = 6 }, new Dog { Name = "dog2", Age = 7 } }
    };

var xml = SerializeToXml(animals);

将生成以下 XML:

<Animals>
  <Dogs>
    <Dog>
      <Name>dog1</Name>
      <Age>6</Age>
    </Dog>
    <Dog>
      <Name>dog2</Name>
      <Age>7</Age>
    </Dog>
  </Dogs>
</Animals>

有关其他信息,请参阅序列化对象数组


推荐阅读