Vergleich zwischen dem Abfragen eines "XDocument" und dem Abfragen eines „XElement“ (C#)Querying an XDocument vs. Querying an XElement (C#)

Das Schreiben von Abfragen für Dokumente, die über XDocument.Load geladen werden, unterscheidet sich geringfügig vom Schreiben von Abfragen für Dokumente, die über XElement.Load geladen werden.When you load a document via XDocument.Load, you will notice that you have to write queries slightly differently than when you load via XElement.Load.

Vergleich zwischen "XDocument.Load" und "XElement.Load"Comparison of XDocument.Load and XElement.Load

Beim Laden eines XML-Dokuments in ein XElement über XElement.Load enthält das XElement am Stamm der XML-Struktur das Stammelement des geladenen Dokuments.When you load an XML document into an XElement via XElement.Load, the XElement at the root of the XML tree contains the root element of the loaded document. Wenn Sie jedoch dasselbe XML-Dokument über XDocument in ein XDocument.Load laden, ist der Stamm der Struktur ein XDocument-Knoten, und das Stammelement des geladenen Dokuments ist der einzige zulässige untergeordnete XElement-Knoten des XDocument.However, when you load the same XML document into an XDocument via XDocument.Load, the root of the tree is an XDocument node, and the root element of the loaded document is the one allowed child XElement node of the XDocument. Die LINQ to XML-Achsen agieren relativ zum Stammknoten.The LINQ to XML axes operate relative to the root node.

Dieses erstes Beispiel lädt eine XML-Struktur mit Load.This first example loads an XML tree using Load. Anschließend fragt es die untergeordneten Elemente des Stamms der Struktur ab:It then queries for the child elements of the root of the tree.

// 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);  

Wie zu erwarten, erzeugt dieses Beispiel die folgende Ausgabe:As expected, this example produces the following output:

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

Das folgende Beispiel entspricht dem vorhergehenden Beispiel, wobei hier die XML-Struktur nicht in ein XDocument, sondern in ein XElement geladen wird:The following example is the same as the one above, with the exception that the XML tree is loaded into an XDocument instead of an 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);  

Dieses Beispiel erzeugt die folgende Ausgabe:This example produces the following output:

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

Dieselbe Abfrage hat also diesmal nicht die drei untergeordneten Knoten, sondern den einen Root-Knoten zurückgegeben.Notice that the same query returned the one Root node instead of the three child nodes.

Ein Ansatz für den Umgang mit diesem Verhalten besteht darin, vor dem Zugreifen auf die Achsenmethoden die Root-Eigenschaft zu verwenden, wie im folgenden Beispiel gezeigt:One approach to dealing with this is to use the Root property before accessing the axes methods, as follows:

// 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);  

Diese Abfrage ist jetzt genauso schnell wie die Abfrage für die Struktur mit dem XElement als Stammelement.This query now performs in the same way as the query on the tree rooted in XElement. Das Beispiel führt zur folgenden Ausgabe:The example produces the following output:

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

Siehe auchSee Also

Basic Queries (LINQ to XML) (C#) (Standardabfragen (LINQ to XML) (C#))Basic Queries (LINQ to XML) (C#)