Partager via


Procédure : créer un document avec des espaces de noms (C#) (LINQ to XML)

Cette rubrique montre comment créer des documents avec des espaces de noms.

Exemple

Pour créer un élément ou un attribut qui se trouve dans un espace de noms, vous devez d'abord déclarer et initialiser un objet XNamespace. Vous devez ensuite utiliser la surcharge d'opérateur d'addition pour combiner l'espace de noms avec le nom local, exprimé sous la forme de chaîne.

L'exemple suivant crée un document avec un espace de noms. Par défaut, LINQ to XML sérialise ce document avec un espace de noms par défaut.

// Create an XML tree in a namespace.
XNamespace aw = "https://www.adventure-works.com";
XElement root = new XElement(aw + "Root",
    new XElement(aw + "Child", "child content")
);
Console.WriteLine(root);

Cet exemple produit la sortie suivante :

<Root xmlns="https://www.adventure-works.com">
  <Child>child content</Child>
</Root>

L'exemple suivant crée un document avec un espace de noms. Il crée également un attribut qui déclare l'espace de noms avec un préfixe d'espace de noms. Pour créer un attribut qui déclare un espace de noms avec un préfixe, vous devez créer un attribut où le nom de l'attribut est le préfixe d'espace de noms, et ce nom est dans l'espace de noms Xmlns. La valeur de cet attribut est l'URI de l'espace de noms.

// Create an XML tree in a namespace, with a specified prefix
XNamespace aw = "https://www.adventure-works.com";
XElement root = new XElement(aw + "Root",
    new XAttribute(XNamespace.Xmlns + "aw", "https://www.adventure-works.com"),
    new XElement(aw + "Child", "child content")
);
Console.WriteLine(root);

Cet exemple produit la sortie suivante :

<aw:Root xmlns:aw="https://www.adventure-works.com">
  <aw:Child>child content</aw:Child>
</aw:Root>

L'exemple suivant illustre la création d'un document qui contient deux espaces de noms. L'un est l'espace de noms par défaut. L'autre est un espace de noms avec un préfixe.

Grâce à l'inclusion d'attributs d'espaces de noms dans l'élément racine, les espaces de noms sont sérialisés de sorte que https://www.adventure-works.com soit l'espace de noms par défaut, et www.fourthcoffee.com est sérialisé avec un préfixe de « fc ». Pour créer un attribut qui déclare un espace de noms par défaut, vous devez créer un attribut avec le nom « xmlns », sans espace de noms. La valeur de l'attribut est l'URI de l'espace de noms par défaut.

// The https://www.adventure-works.com namespace is forced to be the default namespace.
XNamespace aw = "https://www.adventure-works.com";
XNamespace fc = "www.fourthcoffee.com";
XElement root = new XElement(aw + "Root",
    new XAttribute("xmlns", "https://www.adventure-works.com"),
    new XAttribute(XNamespace.Xmlns + "fc", "www.fourthcoffee.com"),
    new XElement(fc + "Child",
        new XElement(aw + "DifferentChild", "other content")
    ),
    new XElement(aw + "Child2", "c2 content"),
    new XElement(fc + "Child3", "c3 content")
);
Console.WriteLine(root);

Cet exemple produit la sortie suivante :

<Root xmlns="https://www.adventure-works.com" xmlns:fc="www.fourthcoffee.com">
  <fc:Child>
    <DifferentChild>other content</DifferentChild>
  </fc:Child>
  <Child2>c2 content</Child2>
  <fc:Child3>c3 content</fc:Child3>
</Root>

L'exemple suivant crée un document qui contient deux espaces de noms, tous deux avec des préfixes d'espaces de noms.

XNamespace aw = "https://www.adventure-works.com";
XNamespace fc = "www.fourthcoffee.com";
XElement root = new XElement(aw + "Root",
    new XAttribute(XNamespace.Xmlns + "aw", aw.NamespaceName),
    new XAttribute(XNamespace.Xmlns + "fc", fc.NamespaceName),
    new XElement(fc + "Child",
        new XElement(aw + "DifferentChild", "other content")
    ),
    new XElement(aw + "Child2", "c2 content"),
    new XElement(fc + "Child3", "c3 content")
);
Console.WriteLine(root);

Cet exemple produit la sortie suivante :

<aw:Root xmlns:aw="https://www.adventure-works.com" xmlns:fc="www.fourthcoffee.com">
  <fc:Child>
    <aw:DifferentChild>other content</aw:DifferentChild>
  </fc:Child>
  <aw:Child2>c2 content</aw:Child2>
  <fc:Child3>c3 content</fc:Child3>
</aw:Root>

Une autre approche permettant d'obtenir les mêmes résultats consiste à utiliser des noms développés au lieu de déclarer et de créer un objet XNamespace.

Cette approche a des implications en termes de performances. Chaque fois que vous passez une chaîne qui contient un nom développé à LINQ to XML, LINQ to XML doit analyser le nom, rechercher l'espace de noms atomisé et rechercher le nom atomisé. Ce processus consomme du temps de processeur. Si les performances sont importantes, vous souhaiterez peut-être déclarer et utiliser un objet XNamespace de manière explicite.

Si la performance revêt une importance cruciale, consultez Préatomisation des objets XName (LINQ to XML) pour plus d'informations.

// Create an XML tree in a namespace, with a specified prefix
XElement root = new XElement("{https://www.adventure-works.com}Root",
    new XAttribute(XNamespace.Xmlns + "aw", "https://www.adventure-works.com"),
    new XElement("{https://www.adventure-works.com}Child", "child content")
);
Console.WriteLine(root);

Cet exemple produit la sortie suivante :

<aw:Root xmlns:aw="https://www.adventure-works.com">
  <aw:Child>child content</aw:Child>
</aw:Root>

Voir aussi

Concepts

Espaces de noms en C# (LINQ to XML)