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 中国語 Web サイトの他の関連記事を参照してください。