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中文網其他相關文章!