Sdílet prostřednictvím


Gewusst wie: Schreiben von Abfragen mit komplexer Filterung

Aktualisiert: November 2007

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 Thema finden Sie ein Beispiel für das Schreiben von Fragen mit komplexer Filterung.

Beispiel

In diesem Beispiel wird gezeigt, wie nach allen PurchaseOrder-Elementen gesucht werden kann, die über ein untergeordnetes Address-Element mit dem Type-Attribut "Shipping" und einem untergeordneten State-Element mit dem Wert "NY" verfügen. Im Beispiel wird eine geschachtelte Abfrage in der Where-Klausel verwendet, und der Any-Operator gibt true zurück, wenn die Auflistung Elemente enthält. Informationen zur Verwendung der methodenbasierten Abfragesyntax finden Sie unter Abfragesyntax und Methodensyntax (LINQ).

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

Weitere Informationen zum Any-Operator finden Sie unter Quantifiziereroperationen.

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

Dieser Code erzeugt die folgende Ausgabe:

99505

Im folgenden Beispiel wird dieselbe Abfrage für XML in einem Namespace gezeigt. 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.

XElement root = XElement.Load("PurchaseOrdersInNamespace.xml");
XNamespace aw = "https://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='https://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

Dieser Code erzeugt die folgende Ausgabe:

99505

Siehe auch

Konzepte

Einfache Abfragen (LINQ to XML)

Quantifiziereroperationen

Projektionsvorgänge

Referenz

Untergeordnete XML-Achseneigenschaft

XML-Attribut Achseneigenschaft

XML-Value-Eigenschaft

Attribute

Elements