Arbeiten mit globalen Namespaces (Visual Basic) (LINQ to XML)
Eine der Schlüsselfunktionen von XML-Literalen in Visual Basic 2008 ist deren Fähigkeit, mit der Imports-Anweisung XML-Namespaces zu deklarieren.Mithilfe dieser Funktion können Sie einen XML-Namespace, der ein Präfix verwendet, oder einen XML-Standardnamespace deklarieren.
Diese Möglichkeit erweist sich in zwei Situationen als hilfreich:Zum einen werden in XML-Literalen deklarierte Namespaces nicht in eingebettete Ausdrücke übertragen.Durch das Deklarieren globaler Namespaces verringert sich der Arbeitsaufwand, der erforderlich ist, wenn Sie eingebettete Ausdrücke mit Namespaces verwenden.Zum anderen müssen Sie globale Namespaces deklarieren, um Namespaces mit XML-Eigenschaften zu verwenden.
Sie können globale Namespaces auf Projektebene deklarieren.Globale Namespaces können auch auf der Modulebene deklariert werden, wobei die globalen Namespaces auf Projektebene außer Kraft gesetzt werden.Schließlich ist es auch möglich, globale Namespaces in einem XML-Literal außer Kraft zu setzen.
Bei Verwendung von XML-Literalen oder XML-Eigenschaften, die sich in global deklarierten Namespaces befinden, können Sie sich den erweiterten Namen der XML-Literale oder -Eigenschaften anzeigen lassen, indem Sie in Visual Studio mit der Maus darauf zeigen.Der erweiterte Name wird dann in einer QuickInfo angezeigt.
Mit der GetXmlNamespace-Methode können Sie ein XNamespace-Objekt abrufen, das einem globalen Namespace entspricht.
Beispiele für globale Namespaces
Das folgende Beispiel deklariert einen globalen Standardnamespace unter Verwendung der Imports-Anweisung und verwendet dann ein XML-Literal, um ein XElement-Objekt in diesem Namespace zu deklarieren:
Imports <xmlns="https://www.adventure-works.com">
Module Module1
Sub Main()
Dim root As XElement = <Root/>
Console.WriteLine(root)
End Sub
End Module
Dieses Beispiel führt zur folgenden Ausgabe:
<Root xmlns="https://www.adventure-works.com" />
Das folgende Beispiel deklariert einen globalen Namespace mit einem Präfix und verwendet dann ein XML-Literal, um ein Element zu initialisieren:
Imports <xmlns:aw="https://www.adventure-works.com">
Module Module1
Sub Main()
Dim root As XElement = <aw:Root/>
Console.WriteLine(root)
End Sub
End Module
Dieses Beispiel führt zur folgenden Ausgabe:
<aw:Root xmlns:aw="https://www.adventure-works.com" />
Globale Namespaces und eingebettete Ausdrücke
Namespaces, die in XML-Literalen deklariert werden, werden nicht in eingebettete Ausdrücke übertragen.Das folgende Beispiel deklariert einen Standardnamespace.Anschließend verwendet das Beispiel einen eingebetteten Ausdruck für das Child-Element.
Dim root As XElement = _
<Root xmlns="https://www.adventure-works.com">
<%= <Child/> %>
</Root>
Console.WriteLine(root)
Dieses Beispiel führt zur folgenden Ausgabe:
<Root xmlns="https://www.adventure-works.com">
<Child />
</Root>
Wie Sie sehen, enthalten die sich ergebenden XML-Daten eine Deklaration eines Standardnamespace, sodass sich das Child-Element nicht in einem Namespace befindet.
Sie können den Namespace im eingebetteten Ausdruck wie folgt neu deklarieren:
Dim root As XElement = _
<Root xmlns="https://www.adventure-works.com">
<%= <Child xmlns="https://www.adventure-works.com"/> %>
</Root>
Console.WriteLine(root)
Dieses Beispiel führt zur folgenden Ausgabe:
<Root xmlns="https://www.adventure-works.com">
<Child xmlns="https://www.adventure-works.com" />
</Root>
Dies ist jedoch umständlicher als die Verwendung des globalen Standardnamespace, der einen besseren Ansatz darstellt.Beim globalen Standardnamespace können Sie XML-Literale verwenden, ohne Namespaces zu deklarieren.Die sich ergebenden XML-Daten befinden sich im global deklarierten Standardnamespace.
Imports <xmlns="https://www.adventure-works.com">
Module Module1
Sub Main()
Dim root As XElement = <Root>
<%= <Child/> %>
</Root>
Console.WriteLine(root)
End Sub
End Module
Dieses Beispiel führt zur folgenden Ausgabe:
<Root xmlns="https://www.adventure-works.com">
<Child />
</Root>
Verwenden von Namespaces mit XML-Eigenschaften
Wenn Sie mit einer XML-Struktur arbeiten, die sich in einem Namespace befindet, und wenn Sie XML-Eigenschaften verwenden, müssen Sie einen globalen Namespace verwenden, damit sich die XML-Eigenschaften ebenfalls im korrekten Namespace befinden.Das folgende Beispiel deklariert eine XML-Struktur in einem Namespace.Anschließend gibt das Beispiel die Anzahl von Child-Elementen aus.
Dim root As XElement = _
<Root xmlns="https://www.adventure-works.com">
<Child>content</Child>
</Root>
Console.WriteLine(root.<Child>.Count())
Diesem Beispiel zufolge gibt es keine Child-Elemente.Es erzeugt die folgende Ausgabe:
0
Wenn Sie aber einen globalen Standardnamespace deklarieren, befinden sich sowohl das XML-Literal als auch die XML-Eigenschaft im globalen Standardnamespace:
Imports <xmlns="https://www.adventure-works.com">
Module Module1
Sub Main()
Dim root As XElement = _
<Root>
<Child>content</Child>
</Root>
Console.WriteLine(root.<Child>.Count())
End Sub
End Module
Diesem Beispiel zufolge gibt es genau ein Child-Element.Es erzeugt die folgende Ausgabe:
1
Wenn Sie einen globalen Namespace deklarieren, der ein Präfix besitzt, können Sie das Präfix sowohl für die XML-Literale als auch für die XML-Eigenschaften verwenden:
Imports <xmlns:aw="https://www.adventure-works.com">
Module Module1
Sub Main()
Dim root As XElement = _
<aw:Root>
<aw:Child>content</aw:Child>
</aw:Root>
Console.WriteLine(root.<aw:Child>.Count())
End Sub
End Module
XNamespace und globale Namespaces
Mit der GetXmlNamespace-Methode können Sie ein XNamespace-Objekt abrufen:
Imports <xmlns:aw="https://www.adventure-works.com">
Module Module1
Sub Main()
Dim root As XElement = <aw:Root/>
Dim xn As XNamespace = GetXmlNamespace(aw)
Console.WriteLine(xn)
End Sub
End Module
Dieses Beispiel führt zur folgenden Ausgabe:
https://www.adventure-works.com