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 ...
c#
serialization
attributes
Jan Remunda
quelle
quelle
Antworten:
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
xsi
und derxsd
Namespaces eineXmlSerializerNamespaces
Instanz mit einem leeren Namespace und übergeben Sie diese, wenn Sie Ihr Objekt serialisieren müssen.Schauen Sie sich dieses Beispiel an:
Ich habe diese Ausgabe erhalten:
quelle
[XmlArray]
dass Sie auch ersetzen müssen, falls vorhanden.Ersetzen
[XmlArrayItem("VARIANT")]
durch[XmlElement("VARIANT")]
.quelle
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,
ShopItem
wü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.
quelle