Sdílet prostřednictvím


Gewusst wie: Verketten von Achsenmethodenaufrufen (LINQ to XML)

Aktualisiert: November 2007

Ein häufig in Code auftretendes Muster ist das Aufrufen einer Achsenmethode, gefolgt von einem Aufruf einer der Erweiterungsmethodenachsen.

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 alle Name-Element in allen Address-Elementen in allen PurchaseOrder-Elementen zu finden.

In diesem Beispiel wird das XML-Dokument in XML-Beispieldatei: Mehrere Aufträge (LINQ to XML) verwendet. XML-Beispieldatei: Mehrere Aufträge (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);
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 führt zur folgenden 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 leitet sich aus XContainer her, sodass Sie die Extensions.Elements-Methode für die Ergebnisse eines Aufrufs der XContainer.Elements-Methode aufrufen können.

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önnten Sie z. B., wie im folgenden Dokument gezeigt, alle ConfigParameter-Elemente abrufen wollen, 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 führt zur folgenden 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 dazu finden Sie unter Arbeiten mit XML-Namespaces.

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

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 führt zur folgenden 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