System.Xml.Linq.XName-Klasse

Dieser Artikel enthält ergänzende Hinweise zur Referenzdokumentation für diese API.

XML-Namen enthalten einen Namespace und einen lokalen Namen. Ein vollqualifizierter Name ist die Kombination aus Namespace und lokalem Namen.

Erstellen eines XName-Objekts

XName enthält keine öffentlichen Konstruktoren. Stattdessen stellt diese Klasse eine implizite Konvertierung aus String bereit, mit der Sie eine XName erstellen können. Die häufigste Stelle, an der Sie diese Konvertierung verwenden, ist das Erstellen eines Elements oder Attributs: Das erste Argument für den XElement-Konstruktor ist XName. Indem Sie eine Zeichenfolge übergeben, nutzen Sie die implizite Konvertierung. Der folgende Code erstellt ein Element mit einem Namen, der sich in keinem Namespace befindet:

XElement root = new XElement("ElementName", "content");
Console.WriteLine(root);

In Visual Basic ist es besser, XML-Literale zu verwenden:

Dim root As XElement = <ElementName>content</ElementName>
Console.WriteLine(root)

Dieses Beispiel erzeugt die folgende Ausgabe:

<ElementName>content</ElementName>

Das Zuweisen einer Zeichenfolge zu einer XName verwendet die implizite Konvertierung von String.

Im Visual Basic-Beispiel wird XElement mithilfe von XML-Literalen erstellt. Obwohl XML-Literale verwendet werden, wird ein XName-Objekt für XElement erstellt.

Darüber hinaus können Sie die Get-Methode für ein XName-Objekt aufrufen. Der empfohlene Weg besteht jedoch darin, die implizite Konvertierung aus einer Zeichenfolge zu verwenden.

Erstellen eines XName in einem Namespace

Wie bei XML kann XName sich in einem oder keinem Namespace befinden.

Für C# wird empfohlen, XName in einem Namespace zu erstellen, das XNamespace-Objekt zu deklarieren und dann die Außerkraftsetzung des Additionsoperators zu verwenden.

Für Visual Basic empfiehlt es sich, XML-Literale und globale Namespacedeklarationen zum Erstellen von XML zu verwenden, die sich in einem Namespace befinden.

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

Dieses Beispiel erzeugt die folgende Ausgabe:

<ElementName xmlns="http://www.adventure-works.com">content</ElementName>

Erstellen eines XName in keinem Namespace

Die Namespace-Eigenschaft eines XName-Objekts ist garantiert nicht null. Wenn sich XName nicht in einem Namespace befindet, wird die Namespace-Eigenschaft auf None festgelegt. Dies veranschaulicht der folgende Code:

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

Dieses Beispiel erzeugt die folgende Ausgabe:

The element is in no namespace.

Verwenden von erweiterten Namen

Sie können XName auch aus einem erweiterten XML-Namen im Formular {namespace}localname erstellen:

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)

Dieses Beispiel erzeugt die folgende Ausgabe:

<ElementName xmlns="http://www.adventure-works.com">content</ElementName>

Beachten Sie, dass das Erstellen von XName durch einen erweiterten Namen weniger effizient ist als das Erstellen eines XNamespace-Objekts und die Verwendung der Außerkraftsetzung des Additionsoperators. Es ist auch weniger effizient als das Importieren eines globalen Namespaces und die Verwendung von XML-Literalen in Visual Basic.

Wenn Sie XName mithilfe eines erweiterten Namen erstellen, muss LINQ to XML die atomisierte Instanz eines Namespaces finden. Diese Arbeit muss für jede Verwendung eines erweiterten Namens wiederholt werden. Diese zusätzliche Zeit ist wahrscheinlich bei der Erstellung von LINQ-Abfragen zu vernachlässigen, kann aber bei der Erstellung einer großen XML-Struktur von Bedeutung sein.

XName-Objekte werden atomisiert

XName-Objekte werden garantiert atomisiert, das heißt, wenn zwei XName-Objekte genau denselben Namespace und genau denselben lokalen Namen haben, werden sie dieselbe Instanz gemeinsam nutzen. Die Gleichheits- und Vergleichsoperatoren werden zu diesem Zweck ebenfalls ausdrücklich bereitgestellt.

Dieses Feature ermöglicht unter anderem die schnellere Ausführung von Abfragen. Beim Filtern nach dem Namen von Elementen oder Attributen verwenden die in Prädikaten ausgedrückten Vergleiche den Identitätsvergleich, nicht den Wertvergleich. Es ist viel schneller festzustellen, dass zwei Verweise tatsächlich auf dasselbe Objekt verweisen, als zwei Zeichenfolgen zu vergleichen.