Vorgehensweise: Verketten von Achsenmethodenaufrufen (LINQ to XML) (C#)

Eine gebräuchliche Vorgehensweise im Code besteht darin, erst eine Achsenmethode und dann eine der Erweiterungsmethodenachsen aufzurufen.

Es gibt zwei Achsenmethoden mit dem Namen Elements, die eine Auflistung von Elementen zurückgeben: die XContainer.Elements-Methode und die Extensions.Elements-Methode. Sie können diese beiden Achsen kombinieren und dann nach allen Elementen eines angegebenen Namens auf einer bestimmten Ebene in der Struktur suchen.

Beispiel

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.

In diesem Beispiel wird das folgende XML-Dokument verwendet: Beispiel-XML-Datei: Mehrere Bestellungen (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:

<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. XElement wird von XContainer abgeleitet. Also können Sie die Extensions.Elements-Methode in den Ergebnissen eines Aufrufs der XContainer.Elements-Methode aufrufen.

Beispiel

Es kann vorkommen, dass Sie alle Elemente auf einer bestimmten Elementebene abrufen möchten, wobei nicht bekannt ist, ob dazwischenkommende Vorgänger vorhanden sind. 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.

<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:

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:

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

Beispiel

Im folgenden Beispiel wird dieselbe Vorgehensweise für XML gezeigt, das sich in einem Namespace befindet. Weitere Informationen finden Sie unter Working with XML Namespaces (C#) (Arbeiten mit XML-Namespaces (C#)).

Dieses Beispiel verwendet das folgende XML-Dokument: Beispiel-XML-Datei: mehrfache Bestellung in einem 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:

<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 auch

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