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, dessenType
-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
- Attribute
- Elements
- Projection Operations (C#) (Projektionsvorgänge (C#))
- Quantifizierer-Vorgänge (C#)
- Untergeordnete XML-Achseneigenschaft (Visual Basic)
- XML-Attributachseneigenschaft (Visual Basic)
- XML-Value-Eigenschaft (Visual Basic)
- Projektionsvorgänge (Visual Basic)
- Quantifizierervorgänge (Visual Basic)