Bereich von Standardnamespaces (LINQ to XML)
Standardnamespaces, wie sie in der XML-Struktur dargestellt werden, befinden sich bei Abfragen nicht innerhalb des gültigen Bereichs. Wenn Sie XML haben, das sich in einem Standard-Namensraum befindet, müssen Sie einen Namensraum mit dem lokalen Namen kombinieren, um einen qualifizierten Namen für die Abfrage zu erhalten.
Ein häufiger Fehler beim Abfragen einer XML-Struktur mit einem Standardnamespace besteht darin, die Abfrage so zu schreiben, als ob der XML-Code nicht in einem Namespace wäre. Das erste Beispiel zeigt eine typische falsche Abfrage eines Standardnamespaces. Die zweite zeigt eine richtige Abfrage.
Beispiel: Falsche Abfrage von XML in einem Namespace
Dieses Beispiel zeigt die Erstellung von XML in einem Namespace und eine unzulässige Abfrage, die eine leere Ergebnismenge liefert.
XElement root = XElement.Parse(
@"<Root xmlns='http://www.adventure-works.com'>
<Child>1</Child>
<Child>2</Child>
<Child>3</Child>
<AnotherChild>4</AnotherChild>
<AnotherChild>5</AnotherChild>
<AnotherChild>6</AnotherChild>
</Root>");
IEnumerable<XElement> c1 =
from el in root.Elements("Child")
select el;
Console.WriteLine("Result set follows:");
foreach (XElement el in c1)
Console.WriteLine((int)el);
Console.WriteLine("End of result set");
Module Module1
Sub Main()
Dim root As XElement = _
<Root xmlns='http://www.adventure-works.com'>
<Child>1</Child>
<Child>2</Child>
<Child>3</Child>
<AnotherChild>4</AnotherChild>
<AnotherChild>5</AnotherChild>
<AnotherChild>6</AnotherChild>
</Root>
Dim c1 As IEnumerable(Of XElement) = _
From el In root.<Child> _
Select el
Console.WriteLine("Result set follows:")
For Each el As XElement In c1
Console.WriteLine(CInt(el))
Next
Console.WriteLine("End of result set")
End Sub
End Module
Dieses Beispiel erzeugt die folgende Ausgabe:
Result set follows:
End of result set
Beispiel: Richtige Abfrage von XML in einem Namespace
Dieses Beispiel zeigt die Erstellung von XML in einem Namespace und eine richtige Abfrage.
In C# ist der korrekte Ansatz, ein XNamespace-Objekt zu deklarieren und zu initialisieren und es bei der Angabe von XName-Objekten zu verwenden. In diesem Fall ist das Argument der Elements-Methode ein XName-Objekt.
Der richtige Ansatz bei Verwendung von Visual Basic besteht darin, einen globalen Standardnamespace zu deklarieren und zu initialisieren. Dadurch werden alle XML-Eigenschaften im Standardnamespace platziert.
Hier folgt der Code:
XElement root = XElement.Parse(
@"<Root xmlns='http://www.adventure-works.com'>
<Child>1</Child>
<Child>2</Child>
<Child>3</Child>
<AnotherChild>4</AnotherChild>
<AnotherChild>5</AnotherChild>
<AnotherChild>6</AnotherChild>
</Root>");
XNamespace aw = "http://www.adventure-works.com";
IEnumerable<XElement> c1 =
from el in root.Elements(aw + "Child")
select el;
Console.WriteLine("Result set follows:");
foreach (XElement el in c1)
Console.WriteLine((int)el);
Console.WriteLine("End of result set");
Imports <xmlns="http://www.adventure-works.com">
Module Module1
Sub Main()
Dim root As XElement = _
<Root xmlns='http://www.adventure-works.com'>
<Child>1</Child>
<Child>2</Child>
<Child>3</Child>
<AnotherChild>4</AnotherChild>
<AnotherChild>5</AnotherChild>
<AnotherChild>6</AnotherChild>
</Root>
Dim c1 As IEnumerable(Of XElement) = _
From el In root.<Child> _
Select el
Console.WriteLine("Result set follows:")
For Each el As XElement In c1
Console.WriteLine(el.Value)
Next
Console.WriteLine("End of result set")
End Sub
End Module
Dieses Beispiel erzeugt die folgende Ausgabe:
Result set follows:
1
2
3
End of result set
Siehe auch
Feedback
https://aka.ms/ContentUserFeedback.
Bald verfügbar: Im Laufe des Jahres 2024 werden wir GitHub-Issues stufenweise als Feedbackmechanismus für Inhalte abbauen und durch ein neues Feedbacksystem ersetzen. Weitere Informationen finden Sie unterFeedback senden und anzeigen für