131 votes

C# sérialisation Xml - désactiver le rendu de l'élément racine du tableau

puis-je d'une certaine manière désactiver le rendu de l'élément racine de la collection?

cette classe avec la sérialisation attribue

 [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 le document xml suivant:

<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?

Aussi je n'ai pas besoin xsi et xsd espaces de noms dans l'élément racine..

Merci beaucoup pour l'aide.

206voto

Rubens Farias Points 33357

Essayez ceci:

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

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

// ...

XmlSerializerNamespaces ns = new XmlSerializerNamespaces();
ns.Add("", "");

ShopItem item = new ShopItem()
{
    ProductName = "test",
    Variants = new List<ShopItem>()
    {
        new ShopItem(){ ProductName = "hi 1" },
        new ShopItem(){ ProductName = "hi 2" }
    }
};

XmlSerializer ser = new XmlSerializer(typeof(ShopItem));
ser.Serialize(Console.Out, item, ns);

J'obtiens ce résultat:

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

35voto

Pent Ploompuu Points 4120

Remplacer [XmlArrayItem("VARIANT")] avec [XmlElement("VARIANT")].

0voto

Rob Levine Points 20793

Je ne crois pas qu'il est possible de supprimer cet élément à l'aide de la valeur par défaut de la sérialisation xml (avec attributs). Si vous pouvez faire cela, alors la sérialisation de votre ShopItem de la classe le résultat en xml mal formé (aucun élément racine) de l'objet, qui n'est pas autorisé.

Ce que vous pouvez faire, cependant, est de mettre en œuvre manuellement IXmlSerializable. Cela vous donnera une sorte de contrôle fin de vous un re après.

[Edit] - désolé, mal lu que vous étiez en train de supprimer les Variantes, pas SHOPITEM. Pour supprimer la Liste "extérieure" de l'élément, il suffit de marquer avec un [XmlElement] attribut plutôt que d'une [XmlArrayItem] attribut. Ce sera la cause de la liste des entrées d'utiliser l'élément spécifié nom, sans emballage la liste à un élément externe.

Pour enlever les espaces de noms, c'est contrôlée par le seriliazer lui-même, pas la marge sur la classe. J'ai juste remarqué que, bien que j'ai mis à jour cette réponse, Rubens Farias a fourni une réponse qui vous montre comment éliminer de l'espace de noms.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X