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中文网其他相关文章!