Freigeben über


Vorgehensweise: Verketten von Achsenmethodenaufrufen (LINQ to XML)

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 XML-Dokument in XML-Beispieldatei: Mehrere Aufträge (LINQ to XML) verwendet.

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);
Dim purchaseOrders As XElement = XElement.Load("PurchaseOrders.xml")
Dim names As IEnumerable(Of XElement) = _
    From el In purchaseOrders.<PurchaseOrder>.<Address>.<Name> _
    Select el
For Each e As XElement In names
    Console.WriteLine(e)
Next

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

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);
Dim root As XElement = XElement.Load("Irregular.xml")
Dim configParameters As IEnumerable(Of XElement) = _
    root.<Customer>.<Config>.<ConfigParameter>
For Each cp As XElement In configParameters
    Console.WriteLine(cp)
Next

Dieses Beispiel erzeugt die folgende Ausgabe:

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

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

In diesem Beispiel wird das XML-Dokument in XML-Beispieldatei: Mehrere Aufträge in einem Namespace verwendet.

XNamespace aw = "https://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);
Imports <xmlns:aw="https://www.adventure-works.com">

Module Module1
    Sub Main()
        Dim purchaseOrders As XElement = XElement.Load("PurchaseOrdersInNamespace.xml")
        Dim names As IEnumerable(Of XElement) = _
            From el In purchaseOrders.<aw:PurchaseOrder>.<aw:Address>.<aw:Name> _
            Select el
        For Each e As XElement In names
            Console.WriteLine(e)
        Next
    End Sub
End Module

Dieses Beispiel erzeugt die folgende Ausgabe:

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

Siehe auch

Konzepte

LINQ to XML-Achsen