首页 >后端开发 >C++ >如何在 XML 序列化中抑制根数组元素?

如何在 XML 序列化中抑制根数组元素?

Patricia Arquette
Patricia Arquette原创
2024-12-31 18:30:10885浏览

How to Suppress the Root Array Element in XML Serialization?

XML 序列化:抑制根数组元素

问题:

可以序列化 XML集合的根元素被禁用?考虑以下带有属性的类:

[XmlRoot(ElementName="SHOPITEM", Namespace="")]
public class ShopItem
{
    [XmlElement("PRODUCTNAME")]
    public string ProductName { get; set; }  

    [XmlArrayItem("VARIANT")]
    public List<ShopItem> Variants { get; set; }
}

该类生成带有根 的 XML。元素:

<SHOPITEM xmlns:xsi="" xmlns:xsd="">
  <PRODUCTNAME>test</PRODUCTNAME>
  <Variants>
    <VARIANT>
      <PRODUCTNAME>hi 1</PRODUCTNAME>
    </VARIANT>
    <VARIANT>
      <PRODUCTNAME>hi 2</PRODUCTNAME>
    </VARIANT>
  </Variants>
</SHOPITEM>

如何从输出中省略?另外,如何从根元素中删除 xsi 和 xsd 命名空间?

答案:

要消除 元素,将集合属性的 [XmlArrayItem] 属性替换为 [XmlElement]:

[XmlRoot("SHOPITEM")]
public class ShopItem
{
    [XmlElement("PRODUCTNAME")]
    public string ProductName { get; set; }

    [XmlElement("VARIANT")] // was [XmlArrayItem]
    public List<ShopItem> Variants { get; set; }
}

要删除 xsi 和 xsd 命名空间,请创建一个具有空命名空间的 XmlSerializerNamespaces 实例并在序列化期间使用它:

// ...

ShopItem item = new ShopItem() { ProductName = "test", ... };

// This removes the xsi/xsd namespaces from serialization
XmlSerializerNamespaces ns = new XmlSerializerNamespaces();
ns.Add("", "");

XmlSerializer ser = new XmlSerializer(typeof(ShopItem));
ser.Serialize(Console.Out, item, ns); // Pass XmlSerializerNamespaces here

生成的 XML 将具有所需的格式:

<?xml version="1.0" encoding="ibm850"?>
<SHOPITEM>
  <PRODUCTNAME>test</PRODUCTNAME>
  <VARIANT>
    <PRODUCTNAME>hi 1</PRODUCTNAME>
  </VARIANT>
  <VARIANT>
    <PRODUCTNAME>hi 2</PRODUCTNAME>
  </VARIANT>
</SHOPITEM>

以上是如何在 XML 序列化中抑制根数组元素?的详细内容。更多信息请关注PHP中文网其他相关文章!

声明:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn