XML シリアル化: ルート配列要素の抑制
質問:
XML をシリアル化できますかコレクションのルート要素を無効にしますか?属性を持つ次のクラスを考えてみましょう。
[XmlRoot(ElementName="SHOPITEM", Namespace="")] public class ShopItem { [XmlElement("PRODUCTNAME")] public string ProductName { get; set; } [XmlArrayItem("VARIANT")] public List<ShopItem> Variants { get; set; } }
このクラスは、ルート
<SHOPITEM xmlns:xsi="" xmlns:xsd=""> <PRODUCTNAME>test</PRODUCTNAME> <Variants> <VARIANT> <PRODUCTNAME>hi 1</PRODUCTNAME> </VARIANT> <VARIANT> <PRODUCTNAME>hi 2</PRODUCTNAME> </VARIANT> </Variants> </SHOPITEM>
[XmlRoot("SHOPITEM")] public class ShopItem { [XmlElement("PRODUCTNAME")] public string ProductName { get; set; } [XmlElement("VARIANT")] // was [XmlArrayItem] public List<ShopItem> Variants { get; set; } }
出力から省略されますか?さらに、xsi および xsd 名前空間をルート要素から削除するにはどうすればよいですか?
// ... 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 version="1.0" encoding="ibm850"?> <SHOPITEM> <PRODUCTNAME>test</PRODUCTNAME> <VARIANT> <PRODUCTNAME>hi 1</PRODUCTNAME> </VARIANT> <VARIANT> <PRODUCTNAME>hi 2</PRODUCTNAME> </VARIANT> </SHOPITEM>要素で、[XmlArrayItem] 属性をコレクション プロパティの [XmlElement] に置き換えます:xsi および xsd 名前空間を削除するには、空の名前空間で XmlSerializerNamespaces インスタンスを作成し、シリアル化中にそれを使用します:結果の XML は目的の形式になります:
以上がXML シリアル化でルート配列要素を抑制するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。