Så här felsöker du tomma frågeresultatuppsättningar (LINQ till XML)
Ett av de vanligaste problemen vid frågor mot XML-träd är att om XML-trädet har ett standardnamnområde skriver utvecklaren ibland frågan som om XML inte fanns i ett namnområde.
Den första uppsättningen exempel i den här artikeln visar ett typiskt sätt att XML i ett standardnamnområde läses in och sedan efterfrågas felaktigt.
Den andra uppsättningen exempel visar nödvändiga korrigeringar så att du kan fråga XML i ett namnområde.
Mer information finns i Översikt över namnområden.
Exempel: En felaktig fråga i XML i ett namnområde
Det här exemplet visar skapandet av XML i ett namnområde och en fråga som returnerar en tom resultatuppsättning.
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");
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")
Exemplet ger följande resultat:
Result set follows:
End of result set
Exempel: En korrekt fråga om XML i ett namnområde
Det här exemplet visar skapandet av XML i ett namnområde och en fråga som är korrekt kodad.
Lösningen är att deklarera och initiera ett XNamespace objekt och använda det när du XName anger objekt. I det här fallet är argumentet till Elements metoden ett XName objekt.
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(CInt(el))
Next
Console.WriteLine("End of result set")
End Sub
End Module
Exemplet ger följande resultat:
Result set follows:
1
2
3
End of result set