Verketten von Aufrufen des Axis-Methode (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: Abrufen aller Namenselemente

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.

Im Beispiel wird das XML-Dokument XML-Beispieldatei: Mehrere Bestellungen 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<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: Abrufen aller Elemente auf einer bestimmten Ebene

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>

Beispiel: Abrufen von Elementen für XML-Daten in einem Namespace

Im folgenden Beispiel wird dieselbe Vorgehensweise für XML-Daten gezeigt, die sich in einem Namespace befinden. Weitere Informationen finden Sie unter Übersicht über Namespaces.

Dieses Beispiel verwendet das XML-Dokument XML-Beispieldatei: Mehrere Bestellungen 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);
Imports <xmlns:aw="http://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="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