Partage via


Créer des arborescences XML en C# (LINQ to XML)

Cet article fournit des informations sur la création d’arborescences XML en C#.

Pour savoir comment utiliser les résultats des requêtes LINQ comme contenu d’un objet XElement, consultez Construction fonctionnelle.

Construire des éléments

Les signatures des constructeurs XElement et XAttribute vous permettent de passer le contenu de l'élément ou attribut en tant qu'arguments du constructeur. Étant donné que l’un des constructeurs prend une quantité variable d’arguments, vous pouvez passer une quantité quelconque d’éléments enfants. Bien entendu, chacun de ces éléments enfants peut contenir ses propres éléments enfants. Pour tout élément, vous pouvez ajouter une quantité quelconque d'attributs.

Lors de l'ajout d'objets XNode (y compris XElement) ou XAttribute, si le contenu n'a pas de parent, les objets sont simplement attachés à l'arborescence XML. Si le nouveau contenu a déjà un parent et fait partie d’une autre arborescence XML, il est cloné et le nouveau contenu cloné est attaché à l’arborescence XML. Ceci est illustré dans le dernier exemple de cet article.

Pour créer un XElement contacts, vous pouvez utiliser le code suivant :

XElement contacts =
    new XElement("Contacts",
        new XElement("Contact",
            new XElement("Name", "Patrick Hines"),
            new XElement("Phone", "206-555-0144"),
            new XElement("Address",
                new XElement("Street1", "123 Main St"),
                new XElement("City", "Mercer Island"),
                new XElement("State", "WA"),
                new XElement("Postal", "68042")
            )
        )
    );

S'il est mis en retrait correctement, le code pour construire des objets XElement ressemble étroitement à la structure du code XML sous-jacent.

Constructeurs XElement

La classe XElement utilise les constructeurs suivants pour la construction fonctionnelle. Notez qu’il existe d’autres constructeurs pour XElement, mais ils ne sont pas répertoriés ici, car ils ne sont pas utilisés pour la construction fonctionnelle.

Constructeur Description
XElement(XName name, object content) Crée un objet XElement. Le paramètre name spécifie le nom de l'élément ; content spécifie le contenu de l'élément.
XElement(XName name) Crée un objet XElement avec son objet XName initialisé au nom spécifié.
XElement(XName name, params object[] content) Crée un objet XElement avec son objet XName initialisé au nom spécifié. Les attributs et/ou éléments enfants sont créés à partir du contenu de la liste de paramètres.

Le paramètre content est extrêmement souple. Il prend en charge tout type d’objet qui est un enfant valide d’un objet XElement. Les règles suivantes s'appliquent à différents types d'objets passés dans ce paramètre :

  • Une chaîne est ajoutée en tant que contenu de texte.
  • Un objet XElement est ajouté en tant qu'élément enfant.
  • Un objet XAttribute est ajouté en tant qu'attribut.
  • Un objet XProcessingInstruction, XComment ou XText est ajouté en tant que contenu enfant.
  • Un objet IEnumerable est énuméré et ces règles sont appliquées de manière récursive aux résultats.
  • Pour tout autre type, sa méthode ToString est appelée et le résultat est ajouté en tant que contenu texte.

Exemple : Créer un objet XElement avec du contenu

Vous pouvez créer un objet XElement qui contient du contenu simple avec un appel de méthode unique. Pour cela, spécifiez le contenu comme second paramètre, comme suit :

XElement n = new XElement("Customer", "Adventure Works");
Console.WriteLine(n);

Cet exemple produit la sortie suivante :

<Customer>Adventure Works</Customer>

Vous pouvez passer tout type d'objet en tant que contenu. Par exemple, le code suivant crée un élément qui contient un nombre à virgule flottante en tant que contenu :

XElement n = new XElement("Cost", 324.50);
Console.WriteLine(n);

Cet exemple produit la sortie suivante :

<Cost>324.5</Cost>

Le nombre à virgule flottante est boxed et passé au constructeur. Le nombre boxed est converti en une chaîne et utilisé comme contenu de l'élément.

Exemple : Créer un objet XElement avec un élément enfant

Si vous passez une instance de la classe XElement comme argument de contenu, le constructeur crée un élément avec un élément enfant :

XElement shippingUnit = new XElement("ShippingUnit",
    new XElement("Cost", 324.50)
);
Console.WriteLine(shippingUnit);

Cet exemple produit la sortie suivante :

<ShippingUnit>
  <Cost>324.5</Cost>
</ShippingUnit>

Exemple : Créer un objet XElement avec plusieurs éléments enfants

Vous pouvez passer une quantité quelconque d'objets XElement comme contenu. Chacun des objets XElement est inclus en tant qu'élément enfant.

XElement address = new XElement("Address",
    new XElement("Street1", "123 Main St"),
    new XElement("City", "Mercer Island"),
    new XElement("State", "WA"),
    new XElement("Postal", "68042")
);
Console.WriteLine(address);

Cet exemple produit la sortie suivante :

<Address>
  <Street1>123 Main St</Street1>
  <City>Mercer Island</City>
  <State>WA</State>
  <Postal>68042</Postal>
</Address>

En développant l’exemple précédent, vous pouvez créer une arborescence XML entière comme suit :

XElement contacts =
    new XElement("Contacts",
        new XElement("Contact",
            new XElement("Name", "Patrick Hines"),
            new XElement("Phone", "206-555-0144"),
            new XElement("Address",
                new XElement("Street1", "123 Main St"),
                new XElement("City", "Mercer Island"),
                new XElement("State", "WA"),
                new XElement("Postal", "68042")
            )
        )
    );
Console.WriteLine(contacts);

Cet exemple produit la sortie suivante :

<Contacts>
  <Contact>
    <Name>Patrick Hines</Name>
    <Phone>206-555-0144</Phone>
    <Address>
      <Street1>123 Main St</Street1>
      <City>Mercer Island</City>
      <State>WA</State>
      <Postal>68042</Postal>
    </Address>
  </Contact>
</Contacts>

Exemple : Créer un XElement avec un XAttribute

Si vous passez une instance de la classe XAttribute comme argument de contenu, le constructeur crée un élément avec un attribut :

XElement phone = new XElement("Phone",
    new XAttribute("Type", "Home"),
    "555-555-5555");
Console.WriteLine(phone);

Cet exemple produit la sortie suivante :

<Phone Type="Home">555-555-5555</Phone>

Exemple : Créer un élément vide

Pour créer un objet XElement vide, ne transmettez pas de contenu au constructeur. L'exemple suivant crée un élément vide :

XElement n = new XElement("Customer");
Console.WriteLine(n);

Cet exemple produit la sortie suivante :

<Customer />

Exemple : Attacher/cloner

Comme mentionné précédemment, lors de l’ajout d’objets XNode (y compris XElement) ou XAttribute, si le contenu n’a pas de parent, les objets sont simplement attachés à l’arborescence XML. Si le nouveau contenu a déjà un parent et fait partie d’une autre arborescence XML, il est cloné et le nouveau contenu cloné est attaché à l’arborescence XML.

L’exemple suivant illustre le comportement lorsque vous ajoutez un élément apparenté à une arborescence et lorsque vous ajoutez un élément non apparenté à une arborescence :

// Create a tree with a child element.
XElement xmlTree1 = new XElement("Root",
    new XElement("Child1", 1)
);

// Create an element that's not parented.
XElement child2 = new XElement("Child2", 2);

// Create a tree and add Child1 and Child2 to it.
XElement xmlTree2 = new XElement("Root",
    xmlTree1.Element("Child1"),
    child2
);

// Compare Child1 identity.
Console.WriteLine("Child1 was {0}",
    xmlTree1.Element("Child1") == xmlTree2.Element("Child1") ?
    "attached" : "cloned");

// Compare Child2 identity.
Console.WriteLine("Child2 was {0}",
    child2 == xmlTree2.Element("Child2") ?
    "attached" : "cloned");

// This example produces the following output:
//    Child1 was cloned
//    Child2 was attached

Voir aussi