Udostępnij przez


Zapytanie XDocument a zapytanie XElement (LINQ to XML)

Zapytanie, które piszesz podczas ładowania dokumentu za pomocą XDocument.Load, nieco się różni od tego, które stosujesz przy ładowaniu za pomocą XElement.Load.

Porównanie i XDocument.LoadXElement.Load

Podczas ładowania dokumentu XML do XElement za pomocą XElement.Load, XElement w korzeniu 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.Load, element 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 potomne korzenia 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 XDocument, a nie do 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 XElement.

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

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