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)
Referenz
Untergeordnete XML-Achseneigenschaft