Fouten opsporen in lege queryresultatensets (LINQ naar XML)
Een van de meest voorkomende problemen bij het uitvoeren van query's op XML-structuren is dat als de XML-structuur een standaardnaamruimte heeft, de ontwikkelaar soms de query schrijft alsof de XML zich niet in een naamruimte bevindt.
In de eerste set voorbeelden in dit artikel ziet u een typische manier waarop XML in een standaardnaamruimte wordt geladen en vervolgens onjuist wordt opgevraagd.
In de tweede set voorbeelden ziet u de benodigde correcties, zodat u een query kunt uitvoeren op XML in een naamruimte.
Zie het overzicht van naamruimten voor meer informatie.
Voorbeeld: Een onjuiste query op XML in een naamruimte
In dit voorbeeld ziet u het maken van XML in een naamruimte en een query die een lege resultatenset retourneert.
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")
In het voorbeeld wordt dit resultaat gegenereerd:
Result set follows:
End of result set
Voorbeeld: Een juiste query op XML in een naamruimte
In dit voorbeeld ziet u het maken van XML in een naamruimte en een query die correct is gecodeerd.
De oplossing is het declareren en initialiseren van een XNamespace object en het gebruiken bij het opgeven van XName objecten. In dit geval is het argument voor de Elements methode een XName object.
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
In het voorbeeld wordt dit resultaat gegenereerd:
Result set follows:
1
2
3
End of result set