Statisch kompilierte Abfragen (LINQ to XML) (C#)Statically Compiled Queries (LINQ to XML) (C#)

Einer der wichtigsten Leistungsvorteile von LINQ to XML (im Unterschied zu XmlDocument) besteht darin, dass Abfragen in LINQ to XML statisch kompiliert werden. XPath-Abfragen müssen dagegen zur Laufzeit interpretiert werden.One of the most important performance benefits LINQ to XML, as opposed to XmlDocument, is that queries in LINQ to XML are statically compiled, whereas XPath queries must be interpreted at run time. Diese Funktion ist in LINQ to XML integriert, sodass Sie keine zusätzlichen Schritte ausführen müssen, um diesen Vorteil zu nutzen. Es ist jedoch hilfreich, den Unterschied zu verstehen, wenn Sie eine Auswahl zwischen den beiden Technologien treffen.This feature is built in to LINQ to XML, so you do not have to perform extra steps to take advantage of it, but it is helpful to understand the distinction when choosing between the two technologies. In diesem Thema wird der Unterschied erklärt.This topic explains the difference.

Statisch kompilierte Abfragen und XPathStatically Compiled Queries vs. XPath

Im folgenden Beispiel wird gezeigt, wie Sie die Nachfolgerelemente mit einem bestimmten Namen und mit einem Attribut mit einem bestimmten Wert abrufen können.The following example shows how to get the descendant elements with a specified name, and with an attribute with a specified value.

Hier folgt der entsprechende XPath-Ausdruck:The following is the equivalent XPath expression:

//Address[@Type='Shipping']  
XDocument po = XDocument.Load("PurchaseOrders.xml");  

IEnumerable<XElement> list1 =  
    from el in po.Descendants("Address")  
    where (string)el.Attribute("Type") == "Shipping"  
    select el;  

foreach (XElement el in list1)  
    Console.WriteLine(el);  

Der Abfrageausdruck in diesem Beispiel wird vom Compiler in eine methodenbasierte Abfragesyntax umgeschrieben.The query expression in this example is re-written by the compiler to method-based query syntax. Das folgende in methodenbasierter Abfragesyntax geschriebene Beispiel führt zum selben Ergebnis wie das vorherige Beispiel:The following example, which is written in method-based query syntax, produces the same results as the previous one:

XDocument po = XDocument.Load("PurchaseOrders.xml");  

IEnumerable<XElement> list1 =  
    po  
    .Descendants("Address")  
    .Where(el => (string)el.Attribute("Type") == "Shipping");  

foreach (XElement el in list1)  
    Console.WriteLine(el);  

Die Where-Methode ist eine Erweiterungsmethode.The Where method is an extension method. Weitere Informationen finden Sie unter Erweiterungsmethoden.For more information, see Extension Methods. Da Where eine Erweiterungsmethode ist, wird die obige Abfrage kompiliert, als wäre sie wie folgt geschrieben:Because Where is an extension method, the query above is compiled as though it were written as follows:

XDocument po = XDocument.Load("PurchaseOrders.xml");  

IEnumerable<XElement> list1 =  
    System.Linq.Enumerable.Where(  
        po.Descendants("Address"),  
        el => (string)el.Attribute("Type") == "Shipping");  

foreach (XElement el in list1)  
    Console.WriteLine(el);  

Dieses Beispiel führt zu genau den gleichen Ergebnissen wie die beiden vorherigen Beispiele.This example produces exactly the same results as the previous two examples. Dies veranschaulicht die Tatsache, dass Abfragen tatsächlich zu statisch verknüpften Methodenaufrufen kompiliert werden.This illustrates the fact that queries are effectively compiled into statically linked method calls. Hierdurch wird, gemeinsam mit der verzögerten Ausführungssemantik von Iteratoren, die Leistung verbessert.This, combined with the deferred execution semantics of iterators, improves performance. Weitere Informationen zu der verzögerten Ausführungssemantik von Iteratoren finden Sie unter Verzögerte Ausführung und Auswertung in LINQ to XML (C#).For more information about the deferred execution semantics of iterators, see Deferred Execution and Lazy Evaluation in LINQ to XML (C#).

Hinweis

Diese Beispiele sind für den Code repräsentativ, der möglicherweise vom Compiler geschrieben wird.These examples are representative of the code that the compiler might write. Die tatsächliche Implementierung kann in Details von diesen Beispielen abweichen, die Leistung wird jedoch weitgehend mit der dieser Beispiele übereinstimmen.The actual implementation might differ slightly from these examples, but the performance will be the same or similar to these examples.

Ausführen von XPath-Ausdrücken mit XmlDocumentExecuting XPath Expressions with XmlDocument

Im folgenden Beispiel erhalten Sie mit XmlDocument dieselben Ergebnisse wie in den vorherigen Beispielen:The following example uses XmlDocument to accomplish the same results as the previous examples:

XmlReader reader = XmlReader.Create("PurchaseOrders.xml");  
XmlDocument doc = new XmlDocument();  
doc.Load(reader);  
XmlNodeList nl = doc.SelectNodes(".//Address[@Type='Shipping']");  
foreach (XmlNode n in nl)  
    Console.WriteLine(n.OuterXml);  
reader.Close();  

Diese Abfrage gibt dieselbe Ausgabe wie die Beispiele mit LINQ to XML zurück. Der einzige Unterschied ist, dass LINQ to XML das gedruckte XML im Gegensatz zu XmlDocument einrückt.This query returns the same output as the examples that use LINQ to XML; the only difference is that LINQ to XML indents the printed XML, whereas XmlDocument does not.

Der XmlDocument-Ansatz bietet in der Regel nicht die Leistung von LINQ to XML, da die SelectNodes-Methode bei jedem Aufruf intern die folgenden Schritte ausführen muss:However, the XmlDocument approach generally does not perform as well as LINQ to XML, because the SelectNodes method must do the following internally every time it is called:

  • Analysieren der Zeichenfolge, die den XPath-Ausdruck enthält, und Zerlegen der Zeichenfolge in Token.It parses the string that contains the XPath expression, breaking the string into tokens.

  • Überprüfen der Token, um sicherzustellen, dass der XPath-Ausdruck gültig ist.It validates the tokens to make sure that the XPath expression is valid.

  • Übersetzen des Ausdrucks in eine interne Ausdrucksstruktur.It translates the expression into an internal expression tree.

  • Durchlaufen der Knoten und entsprechendes Auswählen der Knoten für das Resultset auf Grundlage der Ausdrucksauswertung.It iterates through the nodes, appropriately selecting the nodes for the result set based on the evaluation of the expression.

Dies sind bedeutend mehr Arbeitsschritte als bei einer entsprechenden LINQ to XML-Abfrage.This is significantly more than the work done by the corresponding LINQ to XML query. Die genauen Leistungsunterschiede variieren je nach Abfragetyp, in der Regel müssen LINQ to XML-Abfragen jedoch weniger Arbeitsschritte ausführen und bieten daher eine bessere Leistung als das Auswerten von XPath-Ausdrücken mit XmlDocument.The specific performance difference varies for different types of queries, but in general LINQ to XML queries do less work, and therefore perform better, than evaluating XPath expressions using XmlDocument.

Siehe auchSee Also

Leistung (LINQ to XML) (C#)Performance (LINQ to XML) (C#)