Classe System.Xml.Linq.XName
Cet article vous offre des remarques complémentaires à la documentation de référence pour cette API.
Les noms XML contiennent un espace de noms et un nom local. Un nom complet est la combinaison de l’espace de noms et du nom local.
Créer un objet XName
XName ne contient aucun constructeur public. Cette classe fournit plutôt une conversion implicite à partir de String qui vous permet de créer un XName. Le lieu le plus courant pour utiliser cette conversion est lors de la construction d’un élément ou d’un attribut : le premier argument du constructeur XElement est un XName. En passant une chaîne, vous profitez de la conversion implicite. Le code suivant crée un élément portant un nom qui n’est présent dans aucun espace de noms :
XElement root = new XElement("ElementName", "content");
Console.WriteLine(root);
Dans Visual Basic, il est plus approprié d’utiliser des littéraux XML :
Dim root As XElement = <ElementName>content</ElementName>
Console.WriteLine(root)
Cet exemple produit la sortie suivante :
<ElementName>content</ElementName>
L’affectation d’une chaîne à un XName utilise la conversion implicite à partir de String.
L’exemple Visual Basic crée le XElement au moyen de littéraux XML. Même en cas d’utilisation de littéraux XML, un objet XName est créé pour le XElement.
En outre, vous pouvez appeler la méthode Get d’un objet XName. La méthode recommandée consiste toutefois à utiliser la conversion implicite à partir de la chaîne.
Créer un XName dans un espace de noms
Comme avec XML, un XName peut être ou pas dans un espace de noms.
Pour C#, l’approche recommandée pour la création d’un XName dans un espace de noms consiste à déclarer l’objet XNamespace, puis à utiliser le remplacement de l’opérateur d’ajout.
Pour Visual Basic, l’approche recommandée consiste à utiliser des littéraux XML et des déclarations d’espace de noms globaux pour créer un code XML qui se trouve dans un espace de noms.
XNamespace aw = "http://www.adventure-works.com";
XElement root = new XElement(aw + "ElementName", "content");
Console.WriteLine(root);
Imports <xmlns="http://www.adventure-works.com">
Module Module1
Sub Main()
Dim root As XElement = <ElementName>content</ElementName>
Console.WriteLine(root)
End Sub
End Module
Cet exemple produit la sortie suivante :
<ElementName xmlns="http://www.adventure-works.com">content</ElementName>
Ne créer aucun XName dans un espace de noms
La propriété Namespace d’un objet XName est garantie ne pas être nul. Si le XName ne se trouve dans aucun espace de noms, la propriété Namespace est définie sur None. Le code suivant illustre cela :
XElement root = new XElement("ElementName", "content");
if (root.Name.Namespace == XNamespace.None)
Console.WriteLine("The element is in no namespace.");
else
Console.WriteLine("The element is in a namespace.");
Dim root As XElement = <ElementName>content</ElementName>
If (root.Name.Namespace Is XNamespace.None) Then
Console.WriteLine("The element is in no namespace.")
Else
Console.WriteLine("The element is in a namespace.")
End If
Cet exemple produit la sortie suivante :
The element is in no namespace.
Utiliser des noms développés
Vous pouvez également créer un XName à partir du nom XML développé dans le formulaire {namespace}localname
:
XElement root = new XElement("{http://www.adventure-works.com}ElementName", "content");
Console.WriteLine(root);
Dim root As XElement = New XElement("{http://www.adventure-works.com}ElementName", "content")
Console.WriteLine(root)
Cet exemple produit la sortie suivante :
<ElementName xmlns="http://www.adventure-works.com">content</ElementName>
N’oubliez pas que la création d’un XName à travers un nom développé est moins efficace que la création d’un objet XNamespace et l’utilisation du remplacement de l’opérateur d’ajout. C’est également moins efficace que d’importer un espace de noms global et d’utiliser des littéraux XML dans Visual Basic.
Si vous créez un XName au moyen du nom développé, LINQ to XML doit trouver l’instance atomisée d’un espace de noms. Ce travail doit être répété pour chaque utilisation d’un nom développé. Ce temps supplémentaire est susceptible d’être négligeable lors de l’écriture de requêtes LINQ. Il peut toutefois être important lors de la création d’une arborescence XML volumineuse.
Les objets XName sont atomisés
Les objets XName sont garantis pour l’atomisation. Autrement dit, si deux objets XName ont exactement le même espace de noms et le même nom local, ils vont partager la même instance. Les opérateurs d’égalité et de comparaison sont également fournis explicitement à cet effet.
Parmi les autres avantages, cette fonctionnalité accélère l’exécution des requêtes. Lors du filtrage du nom ou des attributs des éléments, les comparaisons exprimées en prédicats utilisent la comparaison d’identité, pas la comparaison des valeurs. Il est beaucoup plus rapide de déterminer que deux références font réellement référence au même objet que pour comparer deux chaînes.