【问题标题】:XML serialization duplicate tagsXML序列化重复标签
【发布时间】:2021-10-09 17:00:24
【问题描述】:

这是我的班级结构:

[Serializable]
[XmlRoot("ClientRequestAPI3")]
public class RequestModelAPI3
{
    [XmlElement("source")]
    public string Source { get; set; }

    [XmlElement("destination")]
    public string Destination { get; set; }

    [XmlArray("packages")]
    public Packages[] Packages { get; set; }
}

[Serializable]
[XmlRoot("packages")]
public class Packages
{        
    [XmlElement("package")]
    public int Package { get; set; }
}

它生成的 XML 是:

<?xml version="1.0" encoding="utf-16"?>
<ClientRequestAPI3 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
  <source>Custom Source</source>
  <destination>Custom Destination</destination>
  <packages>
    <Packages>
      <package>1</package>
    </Packages>
    <Packages>
      <package>3</package>
    </Packages>
  </packages>
</ClientRequestAPI3>

但我正在寻找的是:

<?xml version="1.0" encoding="utf-16"?>
<ClientRequestAPI3 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
  <source>Custom Source</source>
  <destination>Custom Destination</destination>
  <packages>
      <package>1</package>
      <package>3</package>
  </packages>
</ClientRequestAPI3>

那么缺少什么以便我可以像上面那样对其进行序列化?

提前致谢,非常感谢您花时间研究它。

【问题讨论】:

    标签: c# xml api


    【解决方案1】:

    类似:

    [Serializable]
    [XmlRoot("ClientRequestAPI3")]
    public class RequestModelAPI3
    {
        [XmlElement("source")]
        public string Source { get; set; }
    
        [XmlElement("destination")]
        public string Destination { get; set; }
    
        [XmlArray("packages")]
        [XmlArrayItem("package")]
        public Packages[] Packages { get; set; }
    }
    
    [Serializable]
    public class Packages
    {  
        [XmlText]
        public int Package { get; set; }
    }
    

    但是 [XmlText] 和附加类在我看来有点臭......

    我认为将 packages 数组声明为 int 数组会更好:

    [XmlArray("packages")]
    [XmlArrayItem("package")]
    public int[] Packages { get; set; }
    

    【讨论】:

      【解决方案2】:

      尝试以下方法:

      using System.Collections.Generic;
      using System.Xml;
      using System.Xml.Serialization;
      
      namespace XmlSerializationFD
      {
          [XmlRoot("ClientRequestAPI3")]
          public class RequestModelAPI3
          {
              [XmlElement("source", Order = 1)]
              public string Source { get; set; }
      
              [XmlElement("destination", Order = 2)]
              public string Destination { get; set; }
      
              [XmlElement("packages", Order = 3)]
              public PackageInfo Packages = new PackageInfo();
             
          }
      
      
          public class PackageInfo
          {
              [XmlElement("package")]
              public List<int> Package { get; set; } = new List<int>();
      
              public void AddPackage(int id)
              {
                  this.Package.Add(id);
              }
          }
      }
      

      【讨论】:

      • 我这样做了,但输出仍然错误:&lt;packages&gt; &lt;package&gt;1&lt;/package&gt; &lt;/packages&gt; &lt;packages&gt; &lt;package&gt;3&lt;/package&gt; &lt;/packages&gt;
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-01-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多