Partager via


Comment créer un document avec des espaces de noms en C# (LINQ to XML)

Cet article explique comment créer des documents en C# qui ont des espaces de noms.

Exemple : Déclarer et initialiser un espace de noms par défaut

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 = "http://www.adventure-works.com";
XElement root = new XElement(aw + "Root",
    new XElement(aw + "Child", "child content")
);
Console.WriteLine(root);

Cet exemple génère la sortie suivante :

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

Exemple : Créer un document qui a un espace de noms et un attribut

L’exemple suivant crée un document avec un namespace. 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 créez un attribut où le nom de l’attribut est le préfixe d’espace de noms et ce nom se trouve 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 = "http://www.adventure-works.com";
XElement root = new XElement(aw + "Root",
    new XAttribute(XNamespace.Xmlns + "aw", "http://www.adventure-works.com"),
    new XElement(aw + "Child", "child content")
);
Console.WriteLine(root);

Cet exemple génère la sortie suivante :

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

Exemple : Créer un document qui a deux espaces de noms, un avec un préfixe

L’exemple suivant montre 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.

En incluant les attributs d’espace de noms dans l’élément racine, les espaces de noms sont sérialisés afin que http://www.adventure-works.com soit l’espace de noms par défaut et que www.fourthcoffee.com soit sérialisé avec un préfixe de fc. Pour créer un attribut qui déclare un espace de noms par défaut, vous créez un attribut avec le nom xmlns, sans espace de noms. La valeur de l’attribut est l’URI d’espace de noms par défaut.

Si une déclaration par défaut d’espace de noms est active, elle s’applique aux objets XElement enfants en préfixant leurs noms locaux avec l’objet XNamespace correspondant. En revanche, les déclarations d’espace de noms par défaut ne s’appliquent pas directement aux noms d’attributs. Par conséquent, les objets XAttribute dans l’espace de noms par défaut sont définis par l'absence de préfixe de l’objet XNamespace correspondant dans leur nom local.

// The http://www.adventure-works.com namespace is forced to be the default namespace.
XNamespace aw = "http://www.adventure-works.com";
XNamespace fc = "www.fourthcoffee.com";
XElement root = new XElement(aw + "Root",
    new XAttribute("xmlns", "http://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 XAttribute("DefaultNs", "default namespace"),
        new XAttribute(fc + "PrefixedNs", "prefixed namespace")
    ),
    new XElement(fc + "Child3", "c3 content",
        new XAttribute("DefaultNs", "default namespace"),
        new XAttribute(fc + "PrefixedNs", "prefixed namespace")
    )
);
Console.WriteLine(root);

Cet exemple génère la sortie suivante :

<Root xmlns="http://www.adventure-works.com" xmlns:fc="www.fourthcoffee.com">
  <fc:Child>
    <DifferentChild>other content</DifferentChild>
  </fc:Child>
  <Child2 DefaultNs="default namespace" fc:PrefixedNs="prefixed namespace">c2 content</Child2>
  <fc:Child3 DefaultNs="default namespace" fc:PrefixedNs="prefixed namespace">c3 content</fc:Child3>

</Root>

Exemple : Créer un document qui a deux espaces de noms, tous deux avec des préfixes

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

XNamespace aw = "http://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 génère la sortie suivante :

<aw:Root xmlns:aw="http://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>

Exemple : Créer un espace de noms à l’aide de noms développés

Une autre façon d’accomplir le même résultat consiste à utiliser des noms développés au lieu de déclarer et de créer un objet XNamespace.

Cette approche a des implications sur les 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 trouver le nom atomisé. Ce processus prend du temps de CPU. Si les performances sont importantes, vous pouvez déclarer et utiliser un objet XNamespace explicitement.

Si les performances sont un problème important, consultez pré-atomisation des objets XName pour plus d’informations.

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

Cet exemple génère la sortie suivante :

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

Voir aussi