Wykonywanie zapytań względem XDocument kwerendy XElement (LINQ to XML)

Zapytanie pisane podczas ładowania dokumentu za pośrednictwem XDocument.Load programu różni się nieco od tego, co zapisujesz podczas ładowania za pomocą polecenia XElement.Load.

Porównanie i XDocument.LoadXElement.Load

Podczas ładowania dokumentu XML do XElement elementu za pomocą elementu XElement.Load, XElement element w katalogu głównym drzewa XML zawiera element główny załadowanego dokumentu. Jednak w przypadku załadowania tego samego dokumentu XML do XDocument elementu za pośrednictwem XDocument.Loadelement główny drzewa jest węzłem XDocument , a elementem głównym załadowanego dokumentu jest jeden dozwolony węzeł podrzędny XElementXDocument. Osie LINQ to XML działają względem węzła głównego.

Przykład: ładowanie drzewa XML przy użyciu elementu XElement.Load, a następnie wykonywanie zapytania o elementy podrzędne

W tym pierwszym przykładzie ładuje drzewo XML przy użyciu polecenia Load. Następnie wykonuje zapytanie o elementy podrzędne katalogu głównego drzewa.

// Create a simple document and write it to a file
File.WriteAllText("Test.xml", @"<Root>
    <Child1>1</Child1>
    <Child2>2</Child2>
    <Child3>3</Child3>
</Root>");

Console.WriteLine("Querying tree loaded with XElement.Load");
Console.WriteLine("----");
XElement doc = XElement.Load("Test.xml");
IEnumerable<XElement> childList =
    from el in doc.Elements()
    select el;
foreach (XElement e in childList)
    Console.WriteLine(e);
' Create a simple document and  write it to a file
File.WriteAllText("Test.xml", "<Root>" + Environment.NewLine + _
    "    <Child1>1</Child1>" + Environment.NewLine + _
    "    <Child2>2</Child2>" + Environment.NewLine + _
    "    <Child3>3</Child3>" + Environment.NewLine + _
    "</Root>")

Console.WriteLine("Querying tree loaded with XElement.Load")
Console.WriteLine("----")
Dim doc As XElement = XElement.Load("Test.xml")
Dim childList As IEnumerable(Of XElement) = _
        From el In doc.Elements() _
        Select el
For Each e As XElement In childList
    Console.WriteLine(e)
Next

Ten przykład generuje następujące wyniki:

Querying tree loaded with XElement.Load
----
<Child1>1</Child1>
<Child2>2</Child2>
<Child3>3</Child3>

Przykład: ładowanie drzewa XML przy użyciu elementu XDocument.Load, a następnie wykonywanie zapytania o elementy podrzędne

W następnym przykładzie jest to samo, co powyżej, ale drzewo XML zostało załadowane do XDocumentelementu , a nie XElement.

// Create a simple document and write it to a file
File.WriteAllText("Test.xml", @"<Root>
    <Child1>1</Child1>
    <Child2>2</Child2>
    <Child3>3</Child3>
</Root>");

Console.WriteLine("Querying tree loaded with XDocument.Load");
Console.WriteLine("----");
XDocument doc = XDocument.Load("Test.xml");
IEnumerable<XElement> childList =
    from el in doc.Elements()
    select el;
foreach (XElement e in childList)
    Console.WriteLine(e);
' Create a simple document and  write it to a file
File.WriteAllText("Test.xml", "<Root>" + Environment.NewLine + _
    "    <Child1>1</Child1>" + Environment.NewLine + _
    "    <Child2>2</Child2>" + Environment.NewLine + _
    "    <Child3>3</Child3>" + Environment.NewLine + _
    "</Root>")

Console.WriteLine("Querying tree loaded with XDocument.Load")
Console.WriteLine("----")
Dim doc As XDocument = XDocument.Load("Test.xml")
Dim childList As IEnumerable(Of XElement) = _
        From el In doc.Elements() _
        Select el
For Each e As XElement In childList
    Console.WriteLine(e)
Next

Ten przykład generuje następujące wyniki:

Querying tree loaded with XDocument.Load
----
<Root>
  <Child1>1</Child1>
  <Child2>2</Child2>
  <Child3>3</Child3>
</Root>

Zwróć uwagę, że to samo zapytanie zwróciło jeden Root węzeł zamiast trzech węzłów podrzędnych.

Jednym z podejść do radzenia sobie z tym jest użycie Root właściwości przed uzyskaniem dostępu do metod osi w następujący sposób:

// Create a simple document and write it to a file
File.WriteAllText("Test.xml", @"<Root>
    <Child1>1</Child1>
    <Child2>2</Child2>
    <Child3>3</Child3>
</Root>");

Console.WriteLine("Querying tree loaded with XDocument.Load");
Console.WriteLine("----");
XDocument doc = XDocument.Load("Test.xml");
IEnumerable<XElement> childList =
    from el in doc.Root.Elements()
    select el;
foreach (XElement e in childList)
    Console.WriteLine(e);
' Create a simple document and  write it to a file
File.WriteAllText("Test.xml", "<Root>" + Environment.NewLine + _
    "    <Child1>1</Child1>" + Environment.NewLine + _
    "    <Child2>2</Child2>" + Environment.NewLine + _
    "    <Child3>3</Child3>" + Environment.NewLine + _
    "</Root>")

Console.WriteLine("Querying tree loaded with XDocument.Load")
Console.WriteLine("----")
Dim doc As XDocument = XDocument.Load("Test.xml")
Dim childList As IEnumerable(Of XElement) = _
        From el In doc.Root.Elements() _
        Select el
For Each e As XElement In childList
    Console.WriteLine(e)
Next

To zapytanie działa teraz w taki sam sposób, jak zapytanie na drzewie zakorzenionym w elem XElement.

Ten przykład generuje następujące wyniki:

Querying tree loaded with XDocument.Load
----
<Child1>1</Child1>
<Child2>2</Child2>
<Child3>3</Child3>