Heim >Backend-Entwicklung >C++ >Wie deaktiviere ich das Root-Element-Rendering in der XML-Serialisierung für Arrays?
XML-Serialisierung: Deaktivieren des Renderns von Root-Elementen in Arrays
Serialisierung ist ein entscheidender Prozess in der Softwareentwicklung, der die Konvertierung von Objekten in ein persistentes Format wie XML. Es kann jedoch vorkommen, dass Sie das Serialisierungsverhalten ändern möchten, z. B. das Rendering des Stammelements für Sammlungen deaktivieren.
Stammelement-Rendering deaktivieren
Überlegen Sie, ob dies der Fall ist Eine Klasse, die einen Shop-Artikel mit einem Produktnamen und einer Variantenliste darstellt. Standardmäßig erzeugt die Serialisierung mit XML-Annotationen wie [XmlRoot] und [XmlArrayItem] das folgende XML:
<SHOPITEM> <PRODUCTNAME>test</PRODUCTNAME> <Variants> <VARIANT> <PRODUCTNAME>hi 1</PRODUCTNAME> </VARIANT> <VARIANT> <PRODUCTNAME>hi 2</PRODUCTNAME> </VARIANT> </Variants> </SHOPITEM>
Möglicherweise möchten Sie jedoch das Variants-Element ganz eliminieren. Um dies zu erreichen, ersetzen Sie in Ihrem Code das Attribut [XmlArrayItem] durch [XmlElement]. Dadurch wird der Serialisierer angewiesen, die Varianten als direkte untergeordnete Elemente des SHOPITEM-Stammelements darzustellen.
<SHOPITEM> <PRODUCTNAME>test</PRODUCTNAME> <VARIANT> <PRODUCTNAME>hi 1</PRODUCTNAME> </VARIANT> <VARIANT> <PRODUCTNAME>hi 2</PRODUCTNAME> </VARIANT> </SHOPITEM>
Namespaces entfernen
Möglicherweise bemerken Sie auch das Vorhandensein von xsi und xsd Namespaces im Root-Element. Bei Bedarf können Sie diese Namespaces entfernen, indem Sie eine XmlSerializerNamespaces-Instanz mit einem leeren Namespace erstellen und diesen während der Serialisierung bereitstellen.
Beispielcode
Das folgende Beispiel demonstriert das Beschriebene Änderungen:
[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);
Ausgabe
Das resultierende XML ohne das Variants-Element und die Namespaces:
<SHOPITEM> <PRODUCTNAME>test</PRODUCTNAME> <VARIANT> <PRODUCTNAME>hi 1</PRODUCTNAME> </VARIANT> <VARIANT> <PRODUCTNAME>hi 2</PRODUCTNAME> </VARIANT> </SHOPITEM>
Das obige ist der detaillierte Inhalt vonWie deaktiviere ich das Root-Element-Rendering in der XML-Serialisierung für Arrays?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!