首页 >后端开发 >C++ >如何在数组的 XML 序列化中禁用根元素呈现?

如何在数组的 XML 序列化中禁用根元素呈现?

Mary-Kate Olsen
Mary-Kate Olsen原创
2025-01-03 16:34:41775浏览

How to Disable Root Element Rendering in XML Serialization for Arrays?

XML 序列化:禁用数组中根元素的渲染

序列化是软件开发中的一个关键过程,它使对象能够转换为持久格式,如 XML。但是,有时您可能希望修改序列化行为,例如禁用集合的根元素渲染。

禁用根元素渲染

考虑表示商店商品的类,包含产品名称和变体列表。默认情况下,使用 [XmlRoot] 和 [XmlArrayItem] 等 XML 注释进行序列化会生成以下 XML:

<SHOPITEM>
  <PRODUCTNAME>test</PRODUCTNAME>
  <Variants>
    <VARIANT>
      <PRODUCTNAME>hi 1</PRODUCTNAME>
    </VARIANT>
    <VARIANT>
      <PRODUCTNAME>hi 2</PRODUCTNAME>
    </VARIANT>
  </Variants>
</SHOPITEM>

但是,您可能希望完全消除 Variants 元素。为此,请在代码中将 [XmlArrayItem] 属性替换为 [XmlElement]。这指示序列化器将变体渲染为 SHOPITEM 根元素的直接子元素。

<SHOPITEM>
  <PRODUCTNAME>test</PRODUCTNAME>
  <VARIANT>
    <PRODUCTNAME>hi 1</PRODUCTNAME>
  </VARIANT>
  <VARIANT>
    <PRODUCTNAME>hi 2</PRODUCTNAME>
  </VARIANT>
</SHOPITEM>

删除命名空间

您可能还会注意到 xsi 和 xsd 的存在根元素中的命名空间。如果需要,您可以通过创建具有空命名空间的 XmlSerializerNamespaces 实例并在序列化期间提供它来删除这些命名空间。

示例代码

以下示例演示了所描述的修改:

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

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

// ...

ShopItem item = new ShopItem()
{
    ProductName = "test",
    Variants    = new List<ShopItem>()
    {
        new ShopItem{ ProductName = "hi 1" },
        new ShopItem{ ProductName = "hi 2" }
    }
};

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

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

输出

不带 Variants 元素和命名空间的结果 XML:


<SHOPITEM>
  <PRODUCTNAME>test</PRODUCTNAME>
  <VARIANT>
    <PRODUCTNAME>hi 1</PRODUCTNAME>
  </VARIANT>
  <VARIANT>
    <PRODUCTNAME>hi 2</PRODUCTNAME>
  </VARIANT>
</SHOPITEM>

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

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