如何将重复的 XML 元素序列化为数组?

Posted

技术标签:

【中文标题】如何将重复的 XML 元素序列化为数组?【英文标题】:How to serialize duplicate XML elements into an array? 【发布时间】:2021-11-13 16:31:49 【问题描述】:

我正在尝试序列化一些格式不正确的 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>

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

【问题讨论】:

【参考方案1】:

它应该按照https://docs.microsoft.com/en-us/dotnet/standard/serialization/controlling-xml-serialization-using-attributes#serializing-an-array-as-a-sequence-of-elements 中的描述工作,即

[XmlElement(ElementName = "Dog")]
public Dog[] Dogs get;set;

【讨论】:

【参考方案2】:

该问题不包含序列化方法的代码。无论如何,上面描述的 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>

有关更多信息,请参阅Serializing an Array of Objects。

【讨论】:

以上是关于如何将重复的 XML 元素序列化为数组?的主要内容,如果未能解决你的问题,请参考以下文章

如何将对象的json数组反序列化为字典[重复]

如何将 xml 元素值反序列化为 C# 类属性

如何在 .NET 中反序列化为本地集合?

当元素可能是许多可能元素之一时,将 XML 元素反序列化为对象

将属性序列化为元素中的 Xml 属性

C#将不同类型的xml数组反序列化为多个数组