Sérialisation XML : désactivation du rendu de l'élément racine dans les tableaux
La sérialisation est un processus crucial dans le développement logiciel, permettant de convertir des objets en un format persistant comme XML. Cependant, il peut arriver que vous souhaitiez modifier le comportement de la sérialisation, par exemple en désactivant le rendu de l'élément racine pour les collections.
Désactivation du rendu de l'élément racine
Envisagez une classe représentant un article de magasin avec à la fois un nom de produit et une liste de variantes. Par défaut, la sérialisation utilisant des annotations XML telles que [XmlRoot] et [XmlArrayItem] produit le XML suivant :
<SHOPITEM> <PRODUCTNAME>test</PRODUCTNAME> <Variants> <VARIANT> <PRODUCTNAME>hi 1</PRODUCTNAME> </VARIANT> <VARIANT> <PRODUCTNAME>hi 2</PRODUCTNAME> </VARIANT> </Variants> </SHOPITEM>
Cependant, vous souhaiterez peut-être éliminer complètement l'élément Variants. Pour y parvenir, remplacez l'attribut [XmlArrayItem] par [XmlElement] dans votre code. Cela demande au sérialiseur de restituer les variantes en tant qu'enfants directs de l'élément racine SHOPITEM.
<SHOPITEM> <PRODUCTNAME>test</PRODUCTNAME> <VARIANT> <PRODUCTNAME>hi 1</PRODUCTNAME> </VARIANT> <VARIANT> <PRODUCTNAME>hi 2</PRODUCTNAME> </VARIANT> </SHOPITEM>
Suppression des espaces de noms
Vous remarquerez peut-être également la présence de xsi et xsd espaces de noms dans l’élément racine. Si vous le souhaitez, vous pouvez supprimer ces espaces de noms en créant une instance XmlSerializerNamespaces avec un espace de noms vide et en la fournissant lors de la sérialisation.
Exemple de code
L'exemple suivant illustre le modifications :
[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);
Sortie
Le XML résultant sans l'élément Variants et les espaces de noms :
<SHOPITEM> <PRODUCTNAME>test</PRODUCTNAME> <VARIANT> <PRODUCTNAME>hi 1</PRODUCTNAME> </VARIANT> <VARIANT> <PRODUCTNAME>hi 2</PRODUCTNAME> </VARIANT> </SHOPITEM>
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!