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
Mary-Kate OlsenOriginal
2025-01-03 16:34:41792Durchsuche

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>

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!

Stellungnahme:
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