XML-Serialisierung - Deaktivieren Sie das Rendern des Stammelements des Arrays


119

Kann ich das Rendern des Stammelements der Sammlung irgendwie deaktivieren?

Diese Klasse mit Serialisierungsattributen:

[XmlRoot(ElementName="SHOPITEM", Namespace="")]
public class ShopItem
{
    [XmlElement("PRODUCTNAME")]
    public string ProductName { get; set; }       

    [XmlArrayItem("VARIANT")]
    public List<ShopItem> Variants { get; set; }
}

generiert dieses 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>

Ich möchte <Variants>hier kein Element. Was muss ich tun?

Außerdem brauche ich keine xsi- und xsd-Namespaces im Root-Element ...


Antworten:


184

So deaktivieren Sie Rendering von Wurzelelement der Sammlung, müssen Sie das Attribut ersetzen [XmlArrayItem]mit [XmlElement]in Ihrem Code.

Erstellen Sie zum Entfernen des xsiund der xsdNamespaces eine XmlSerializerNamespacesInstanz mit einem leeren Namespace und übergeben Sie diese, wenn Sie Ihr Objekt serialisieren müssen.

Schauen Sie sich dieses Beispiel an:

[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);  // Inform the XmlSerializerNamespaces here

Ich habe diese Ausgabe erhalten:

<?xml version="1.0" encoding="ibm850"?>
<SHOPITEM>
  <PRODUCTNAME>test</PRODUCTNAME>
  <VARIANT>
    <PRODUCTNAME>hi 1</PRODUCTNAME>
  </VARIANT>
  <VARIANT>
    <PRODUCTNAME>hi 2</PRODUCTNAME>
  </VARIANT>
</SHOPITEM>

Beachten Sie, [XmlArray]dass Sie auch ersetzen müssen, falls vorhanden.
dbc


1

Ich glaube nicht, dass es möglich ist, dieses Element mit der Standard-XML-Serialisierung (mit Attributen) zu entfernen. Wenn Sie dies tun könnten, ShopItemwürde die Serialisierung Ihrer Klasse zu einer schlecht geformten XML-Datei (kein Stammelement) für das Objekt führen, was nicht zulässig ist.

Sie können dies jedoch manuell implementieren IXmlSerializable. Dies gibt Ihnen die Art von feinkörniger Kontrolle, nach der Sie suchen.

[ Bearbeiten ] - Entschuldigung - falsch verstanden, dass Sie versucht haben, Varianten zu entfernen, nicht SHOPITEM. Um das "äußere" Element der Liste zu entfernen, markieren Sie es einfach mit einem [XmlElement] -Attribut und nicht mit einem [XmlArrayItem] -Attribut. Dies führt dazu, dass die Listeneinträge nur den angegebenen Elementnamen verwenden, ohne die Liste in ein äußeres Element zu verpacken.

Zum Entfernen der Namespaces wird dies vom Seriliazer selbst gesteuert, nicht vom Markup in der Klasse. Ich habe gerade bemerkt, dass Rubens Farias, während ich diese Antwort aktualisiert habe, eine Antwort bereitgestellt hat, die Ihnen zeigt, wie Sie den Namespace entfernen können.


oops - habe deinen Beitrag falsch verstanden - dachte, du wolltest SHOPITEM entfernen - nur die Antwort bearbeiten!
Rob Levine
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.