System.Xml.Linq.XNamespace-Klasse

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

Diese Klasse stellt das XML-Konstrukt von Namespaces dar.

Jedes XName-Element enthält ein XNamespace-Element. Auch wenn sich ein Element nicht in einem Namespace befindet, enthält der XName des Elements einen Namespace, und zwar XNamespace.None. Es ist gewährleistet, dass die XName.Namespace-Eigenschaft nicht null ist.

Erstellen eines XNamespace-Objekts

Die am häufigsten verwendete Methode zum Erstellen eines XNamespace-Objekts besteht darin, ihm einfach eine Zeichenfolge zuzuweisen. Anschließend können Sie den Namespace mit einem lokalen Namen kombinieren, indem Sie die Außerkraftsetzung des Additionsoperators verwenden. Das folgende Beispiel verdeutlicht dieses Idiom:

XNamespace aw = "http://www.adventure-works.com";
XElement root = new XElement(aw + "Root", "Content");
Console.WriteLine(root);
Dim aw As XNamespace = "http://www.adventure-works.com"
Dim root As XElement = New XElement(aw + "Root", "Content")
Console.WriteLine(root)

In Visual Basic würden Sie jedoch in der Regel wie folgt einen globalen Standardnamespace deklarieren:

Imports <xmlns='http://www.adventure-works.com'>

Module Module1
    Sub Main()
        Dim root As XElement = _
            <Root>Content</Root>
        Console.WriteLine(root)
    End Sub
End Module

Dieses Beispiel erzeugt die folgende Ausgabe:

<Root xmlns="http://www.adventure-works.com">Content</Root>

Beim Zuweisen einer Zeichenfolge zu einem XNamespace-Element wird die implizite Konvertierung von String verwendet.

Weitere Informationen und Beispiele finden Sie unter Erstellen eines Dokuments mit Namespaces in C# (LINQ to XML).

Weitere Informationen zur Verwendung von Namespaces in Visual Basic finden Sie unter Arbeiten mit XML-Namespaces.

Steuern von Namespacepräfixen

Wenn Sie ein Attribut erstellen, das einen Namespace deklariert, wird das im Attribut angegebene Präfix im serialisierten XML-Code beibehalten. Beim Erstellen eines Attributs, das einen Namespace mit einem Präfix deklariert, erstellen Sie ein Attribut, bei dem der Namespace des Namens des Attributs Xmlns lautet und der Name des Attributs das Namespacepräfix ist. Der Wert des Attributs ist der URI des Namespace. Das folgende Beispiel verdeutlicht dieses Idiom:

XNamespace aw = "http://www.adventure-works.com";
XElement root = new XElement(aw + "Root",
    new XAttribute(XNamespace.Xmlns + "aw", "http://www.adventure-works.com"),
    "Content");
Console.WriteLine(root);
Dim aw As XNamespace = "http://www.adventure-works.com"
Dim root As XElement = New XElement(aw + "Root", _
    New XAttribute(XNamespace.Xmlns + "aw", "http://www.adventure-works.com"), _
    "Content")
Console.WriteLine(root)

In Visual Basic verwenden Sie in der Regel eine globale Namespacedeklaration, anstatt einen Namespaceknoten zum Steuern von Namespacepräfixen zu erstellen:

Imports <xmlns:aw='http://www.adventure-works.com'>

Module Module1
    Sub Main()
        Dim root As XElement = _
            <aw:Root>Content</aw:Root>
        Console.WriteLine(root)
    End Sub
End Module

Dieses Beispiel erzeugt die folgende Ausgabe:

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

Weitere Informationen finden Sie unter Steuern von Namespacepräfixen (LINQ to XML).

Erstellen eines Standardnamespace

Beim Erstellen eines Attributs, das als Namespace fungieren wird, wird der Namespace beim Serialisieren der XML-Struktur als Standardnamespace deklariert, wenn der Attributname den speziellen Wert „xmlns“ enthält. Das spezielle Attribut mit dem Namen „xmlns“ selbst befindet sich nicht in einem Namespace. Der Wert des Attributs ist der Namespace-URI.

Im folgenden Beispiel wird eine XML-Struktur erstellt, die ein Attribut enthält, das so deklariert wird, dass der Namespace zum Standardnamespace wird:

XNamespace aw = "http://www.adventure-works.com";
XElement root = new XElement(aw + "Root",
    new XAttribute("xmlns", "http://www.adventure-works.com"),
    new XElement(aw + "Child", "content")
);
Console.WriteLine(root);
Dim aw As XNamespace = "http://www.adventure-works.com"
Dim root As XElement = New XElement(aw + "Root", _
    New XAttribute("xmlns", "http://www.adventure-works.com"), _
    New XElement(aw + "Child", "content") _
)
Console.WriteLine(root)

In Visual Basic verwenden Sie in der Regel eine globale Standardnamespacedeklaration, anstatt einen Namespaceknoten zum Erstellen eines Standardnamespace zu erstellen:

Imports <xmlns='http://www.adventure-works.com'>

Module Module1
    Sub Main()
        Dim root As XElement = _
            <Root>
                <Child>content</Child>
            </Root>
        Console.WriteLine(root)
    End Sub
End Module

Dieses Beispiel erzeugt die folgende Ausgabe:

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

XNamespace-Atomisierung

Es ist gewährleistet, dass XNamespace-Objekte atomisiert werden. Das bedeutet: Wenn zwei XNamespace-Objekte exakt denselben URI besitzen, verwenden sie dieselbe Instanz. Die Gleichheits- und Vergleichsoperatoren werden ausdrücklich zu diesem Zweck bereitgestellt.

Verwenden von erweiterten Namen

Eine weitere Möglichkeit zur Angabe eines Namespace und eines lokalen Namens besteht darin, einen erweiterten Namen im Format {namespace}name zu verwenden:

XElement e = new XElement("{http://www.adventure-works.com}Root",
     new XAttribute("{http://www.adventure-works.com}Att", "content")
);
Console.WriteLine(e);
Dim e As XElement = New XElement("{http://www.adventure-works.com}Root", _
     New XAttribute("{http://www.adventure-works.com}Att", "content") _
)
Console.WriteLine(e)

Dieses Beispiel erzeugt die folgende Ausgabe:

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

Dieser Ansatz wirkt sich aber negativ auf die Leistung aus. Jedes Mal, wenn Sie eine Zeichenfolge, die einen erweiterten Namen enthält, an LINQ to XML übergeben, muss der Name analysiert und nach dem atomisierten Namespace und dem atomisierten Namen gesucht werden. Dieser Prozess nimmt CPU-Zeit in Anspruch. Wenn die Leistung wichtig ist, sollten Sie ggf. einen anderen Ansatz verwenden.

In Visual Basic empfiehlt es sich, XML-Literale zu verwenden, bei denen keine erweiterten Namen verwendet werden müssen.