Puis-je en quelque sorte désactiver le rendu de l'élément racine de la collection?
Cette classe avec des attributs de sérialisation:
[XmlRoot(ElementName="SHOPITEM", Namespace="")]
public class ShopItem
{
[XmlElement("PRODUCTNAME")]
public string ProductName { get; set; }
[XmlArrayItem("VARIANT")]
public List<ShopItem> Variants { get; set; }
}
génère ce 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>
Je ne veux pas d' <Variants>
élément ici. Que dois-je faire?
De plus, je n'ai pas besoin d'espaces de noms xsi et xsd dans l'élément racine ...
c#
serialization
attributes
Jan Remunda
la source
la source
Réponses:
Pour désactiver le rendu de l'élément racine de la collection, vous devez remplacer l'attribut
[XmlArrayItem]
par[XmlElement]
dans votre code.Pour supprimer les espaces de noms
xsi
etxsd
, créez uneXmlSerializerNamespaces
instance avec un espace de noms vide et transmettez-la lorsque vous devez sérialiser votre objet.Jetez un œil à cet exemple:
J'ai eu cette sortie:
la source
[XmlArray]
s'il est présent.Remplacez
[XmlArrayItem("VARIANT")]
par[XmlElement("VARIANT")]
.la source
Je ne pense pas qu'il soit possible de supprimer cet élément en utilisant la sérialisation xml par défaut (avec des attributs). Si vous pouviez faire cela, sérialiser votre
ShopItem
classe entraînerait un XML mal formé (pas d'élément racine) pour l'objet, ce qui n'est pas autorisé.Ce que vous pouvez faire cependant, c'est mettre en œuvre manuellement
IXmlSerializable
. Cela vous donnera le genre de contrôle précis que vous recherchez.[ Modifier ] - désolé - vous avez mal lu que vous essayiez de supprimer des variantes, pas SHOPITEM. Pour supprimer l'élément "externe" de la liste, marquez-le simplement avec un attribut [XmlElement] plutôt qu'avec un attribut [XmlArrayItem]. Cela entraînera que les entrées de la liste utilisent simplement le nom d'élément spécifié, sans envelopper la liste dans un élément externe.
Pour supprimer les espaces de noms, ceci est contrôlé par le seriliazer lui-même, et non par le balisage de la classe. Je viens de remarquer que pendant que j'ai mis à jour cette réponse, Rubens Farias a fourni une réponse qui vous montre comment éliminer l'espace de noms.
la source