【问题标题】:How to serialize duplicate XML elements into an array?如何将重复的 XML 元素序列化为数组?
【发布时间】: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>

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

【问题讨论】:

    标签: c# .net xml asp.net-core xml-serialization


    【解决方案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

      【讨论】:

        猜你喜欢
        • 2015-04-25
        • 1970-01-01
        • 1970-01-01
        • 2019-12-21
        • 1970-01-01
        • 2015-04-13
        • 1970-01-01
        • 1970-01-01
        • 2016-12-02
        相关资源
        最近更新 更多