Heim > Backend-Entwicklung > C++ > Wie deaktiviere ich das Root-Element-Rendering in der XML-Serialisierung für Arrays?

Wie deaktiviere ich das Root-Element-Rendering in der XML-Serialisierung für Arrays?

Mary-Kate Olsen
Freigeben: 2025-01-03 16:34:41
Original
795 Leute haben es durchsucht

How to Disable Root Element Rendering in XML Serialization for 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>
Nach dem Login kopieren

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>
Nach dem Login kopieren

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);
Nach dem Login kopieren

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>
Nach dem Login kopieren

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!

Quelle:php.cn
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Neueste Artikel des Autors
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage