Vorgehensweise: Verketten von Achsenmethodenaufrufen (LINQ to XML) (C#)How to: Chain Axis Method Calls (LINQ to XML) (C#)

Eine gebräuchliche Vorgehensweise im Code besteht darin, erst eine Achsenmethode und dann eine der Erweiterungsmethodenachsen aufzurufen.A common pattern that you will use in your code is to call an axis method, then call one of the extension method axes.

Es gibt zwei Achsenmethoden mit dem Namen Elements, die eine Auflistung von Elementen zurückgeben: die XContainer.Elements-Methode und die Extensions.Elements-Methode.There are two axes with the name of Elements that return a collection of elements: the XContainer.Elements method and the Extensions.Elements method. Sie können diese beiden Achsen kombinieren und dann nach allen Elementen eines angegebenen Namens auf einer bestimmten Ebene in der Struktur suchen.You can combine these two axes to find all elements of a specified name at a given depth in the tree.

BeispielExample

In diesem Beispiel werden XContainer.Elements und Extensions.Elements verwendet, um "nach allen Name-Elementen in allen Address-Elementen in allen PurchaseOrder-Elementen" zu suchen.This example uses XContainer.Elements and Extensions.Elements to find all Name elements in all Address elements in all PurchaseOrder elements.

In diesem Beispiel wird das folgende XML-Dokument verwendet: Beispiel-XML-Datei: Mehrere Bestellungen (LINQ to XML).This example uses the following XML document: Sample XML File: Multiple Purchase Orders (LINQ to XML).

XElement purchaseOrders = XElement.Load("PurchaseOrders.xml");  
IEnumerable<XElement> names =  
    from el in purchaseOrders  
        .Elements("PurchaseOrder")  
        .Elements("Address")  
        .Elements("Name")  
    select el;  
foreach (XElement e in names)  
    Console.WriteLine(e);  

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

<Name>Ellen Adams</Name>  
<Name>Tai Yee</Name>  
<Name>Cristian Osorio</Name>  
<Name>Cristian Osorio</Name>  
<Name>Jessica Arnold</Name>  
<Name>Jessica Arnold</Name>  

Das funktioniert, weil eine der Implementierungen der Elements-Achse als Erweiterungsmethode einer IEnumerable<T> von XContainer verwendet wird.This works because one of the implementations of the Elements axis is as an extension method on IEnumerable<T> of XContainer. XElement wird von XContainer abgeleitet. Also können Sie die Extensions.Elements-Methode in den Ergebnissen eines Aufrufs der XContainer.Elements-Methode aufrufen.XElement derives from XContainer, so you can call the Extensions.Elements method on the results of a call to the XContainer.Elements method.

BeispielExample

Es kann vorkommen, dass Sie alle Elemente auf einer bestimmten Elementebene abrufen möchten, wobei nicht bekannt ist, ob dazwischenkommende Vorgänger vorhanden sind.Sometimes you want to retrieve all elements at a particular element depth when there might or might not be intervening ancestors. So können Sie z. B., wie im folgenden Dokument gezeigt, alle ConfigParameter-Elemente abrufen, die untergeordnete Elemente des Customer-Elements sind, nicht aber den ConfigParameter, der ein untergeordnetes Element des Root-Elements ist.For example, in the following document, you might want to retrieve all the ConfigParameter elements that are children of the Customer element, but not the ConfigParameter that is a child of the Root element.

<Root>  
  <ConfigParameter>RootConfigParameter</ConfigParameter>  
  <Customer>  
    <Name>Frank</Name>  
    <Config>  
      <ConfigParameter>FirstConfigParameter</ConfigParameter>  
    </Config>  
  </Customer>  
  <Customer>  
    <Name>Bob</Name>  
    <!--This customer doesn't have a Config element-->  
  </Customer>  
  <Customer>  
    <Name>Bill</Name>  
    <Config>  
      <ConfigParameter>SecondConfigParameter</ConfigParameter>  
    </Config>  
  </Customer>  
</Root>  

Dazu können Sie die Extensions.Elements-Achse wie folgt verwenden:To do this, you can use the Extensions.Elements axis, as follows:

XElement root = XElement.Load("Irregular.xml");  
IEnumerable<XElement> configParameters =   
    root.Elements("Customer").Elements("Config").  
    Elements("ConfigParameter");  
foreach (XElement cp in configParameters)  
    Console.WriteLine(cp);  

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

<ConfigParameter>FirstConfigParameter</ConfigParameter>  
<ConfigParameter>SecondConfigParameter</ConfigParameter>  

BeispielExample

Im folgenden Beispiel wird dieselbe Vorgehensweise für XML gezeigt, das sich in einem Namespace befindet.The following example shows the same technique for XML that is in a namespace. Weitere Informationen finden Sie unter Working with XML Namespaces (C#) (Arbeiten mit XML-Namespaces (C#)).For more information, see Working with XML Namespaces (C#).

Dieses Beispiel verwendet das folgende XML-Dokument: Beispiel-XML-Datei: mehrfache Bestellung in einem Namespace.This example uses the following XML document: Sample XML File: Multiple Purchase Orders in a Namespace.

XNamespace aw = "http://www.adventure-works.com";  
XElement purchaseOrders = XElement.Load("PurchaseOrdersInNamespace.xml");  
IEnumerable<XElement> names =  
    from el in purchaseOrders  
        .Elements(aw + "PurchaseOrder")  
        .Elements(aw + "Address")  
        .Elements(aw + "Name")  
    select el;  
foreach (XElement e in names)  
    Console.WriteLine(e);  

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

<aw:Name xmlns:aw="http://www.adventure-works.com">Ellen Adams</aw:Name>  
<aw:Name xmlns:aw="http://www.adventure-works.com">Tai Yee</aw:Name>  
<aw:Name xmlns:aw="http://www.adventure-works.com">Cristian Osorio</aw:Name>  
<aw:Name xmlns:aw="http://www.adventure-works.com">Cristian Osorio</aw:Name>  
<aw:Name xmlns:aw="http://www.adventure-works.com">Jessica Arnold</aw:Name>  
<aw:Name xmlns:aw="http://www.adventure-works.com">Jessica Arnold</aw:Name>  

Siehe auchSee Also

LINQ to XML Axes (C#) (LINQ to XML-Achsen (C#))LINQ to XML Axes (C#)