XML シリアル化では、コレクションのルート要素のレンダリングを抑制することが望ましいことがよくあります。これにより、XML 構造が簡素化され、読みやすさが向上します。この記事では、ASP.NET の XmlSerializer を使用してこれを実現する方法について説明します。
XML シリアル化属性を持つ次の ShopItem クラスについて考えてみましょう:
[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="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema"> <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")] // Replaced [XmlArrayItem] public List<ShopItem> Variants { get; set; } }
この変更により、次の単純化された XML が生成されます。
<SHOPITEM> <PRODUCTNAME>test</PRODUCTNAME> <VARIANT> <PRODUCTNAME>hi 1</PRODUCTNAME> </VARIANT> <VARIANT> <PRODUCTNAME>hi 2</PRODUCTNAME> </VARIANT> </SHOPITEM>
さらに、次のような問題が発生する可能性があります。ルート要素内の xsi や xsd などの XML 名前空間。これらを削除するには、空の名前空間を持つ XmlSerializerNamespaces インスタンスを作成し、シリアル化中にそれを渡します。
次に例を示します:
XmlSerializerNamespaces ns = new XmlSerializerNamespaces(); ns.Add("", ""); XmlSerializer ser = new XmlSerializer(typeof(ShopItem)); ser.Serialize(Console.Out, item, ns);
これにより、XML 出力から不要な名前空間が削除されます。
以上がXmlSerializer を使用して XML 配列からルート要素を削除する方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。