Vorgehensweise: Schreiben von Abfragen mit komplexer Filterung (LINQ to XML)

Es kann vorkommen, dass Sie LINQ to XML-Abfragen mit komplexen Filtern schreiben möchten. Vielleicht möchten Sie z. B. auf diese Weise nach allen Elementen suchen, die ein untergeordnetes Element mit einem bestimmten Namen und einem bestimmten Wert besitzen. In diesem Artikel finden Sie ein Beispiel für das Schreiben von Abfragen mit komplexer Filterung.

Beispiel: Suchen mit einer geschachtelten Abfrage in der Where-Klausel

In diesem Beispiel wird gezeigt, wie alle PurchaseOrder-Elemente gefunden werden, die Folgendes enthalten:

  • Ein untergeordnetes Address-Element, dessen Type-Attribut „Shipping“ entspricht.
  • Ein untergeordnetes State-Element, das „NY“ entspricht.

Das Beispiel verwendet eine geschachtelte Abfrage in der Where-Klausel, und der Any-Operator gibt true zurück, sofern die Auflistung überhaupt Elemente enthält. Das Beispiel verwendet das XML-Dokument XML-Beispieldatei: Mehrere Bestellungen.

Weitere Informationen zum Any-Operator finden Sie unter Quantifizierervorgänge (C#) und Quantifizierervorgänge (Visual Basic).

XElement root = XElement.Load("PurchaseOrders.xml");
IEnumerable<XElement> purchaseOrders =
    from el in root.Elements("PurchaseOrder")
    where
        (from add in el.Elements("Address")
        where
            (string)add.Attribute("Type") == "Shipping" &&
            (string)add.Element("State") == "NY"
        select add)
        .Any()
    select el;
foreach (XElement el in purchaseOrders)
    Console.WriteLine((string)el.Attribute("PurchaseOrderNumber"));
Dim root As XElement = XElement.Load("PurchaseOrders.xml")
Dim purchaseOrders As IEnumerable(Of XElement) = _
    From el In root.<PurchaseOrder> _
    Where _
        (From add In el.<Address> _
        Where _
             add.@Type = "Shipping" And _
             add.<State>.Value = "NY" _
        Select add) _
    .Any() _
    Select el
For Each el As XElement In purchaseOrders
    Console.WriteLine(el.@PurchaseOrderNumber)
Next

Dieses Beispiel erzeugt die folgende Ausgabe:

99505

Beispiel: Suchen in XML in einem Namespace

Im folgenden Beispiel wird dieselbe Abfrage wie oben gezeigt, jedoch für XML in einem Namespace. Weitere Informationen finden Sie unter Übersicht über Namespaces.

Dieses Beispiel verwendet das XML-Dokument XML-Beispieldatei: Mehrere Bestellungen in einem Namespace.

XElement root = XElement.Load("PurchaseOrdersInNamespace.xml");
XNamespace aw = "http://www.adventure-works.com";
IEnumerable<XElement> purchaseOrders =
    from el in root.Elements(aw + "PurchaseOrder")
    where
        (from add in el.Elements(aw + "Address")
         where
             (string)add.Attribute(aw + "Type") == "Shipping" &&
             (string)add.Element(aw + "State") == "NY"
         select add)
        .Any()
    select el;
foreach (XElement el in purchaseOrders)
    Console.WriteLine((string)el.Attribute(aw + "PurchaseOrderNumber"));
Imports <xmlns:aw='http://www.adventure-works.com'>

Module Module1
    Sub Main()
        Dim root As XElement = XElement.Load("PurchaseOrdersInNamespace.xml")
        Dim purchaseOrders As IEnumerable(Of XElement) = _
            From el In root.<aw:PurchaseOrder> _
            Where _
                (From add In el.<aw:Address> _
                Where _
                     add.@aw:Type = "Shipping" And _
                     add.<aw:State>.Value = "NY" _
                Select add) _
            .Any() _
            Select el
        For Each el As XElement In purchaseOrders
            Console.WriteLine(el.@aw:PurchaseOrderNumber)
        Next
    End Sub
End Module

Dieses Beispiel erzeugt die folgende Ausgabe:

99505

Siehe auch