Query's schrijven met complexe filters (LINQ naar XML)
Soms wilt u LINQ schrijven naar XML-query's met complexe filters. U moet bijvoorbeeld alle elementen zoeken die een onderliggend element met een bepaalde naam en waarde hebben. Dit artikel bevat een voorbeeld van het schrijven van een query met complexe filters.
Voorbeeld: Zoeken met een geneste query in de Where
component
In dit voorbeeld ziet u hoe u alle PurchaseOrder
elementen kunt vinden met:
- Een onderliggend
Address
element waarvanType
het kenmerk gelijk is aan 'Verzending'. - Een onderliggend
State
element dat gelijk is aan 'NY'.
Er wordt een geneste query in de Where
component gebruikt en de Any
operator retourneert true
of de verzameling elementen bevat. In het voorbeeld wordt een XML-bestand met voorbeeld-XML-documenten gebruikt: Meerdere inkooporders.
Zie Quantifier Operations (C#) en Quantifier Operations (Visual Basic) voor meer informatie over de Any
operator.
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
In dit voorbeeld wordt de volgende uitvoer gegenereerd:
99505
Voorbeeld: Zoeken in XML die zich in een naamruimte bevindt
In het volgende voorbeeld ziet u dezelfde query als hierboven, maar voor XML die zich in een naamruimte bevindt. Zie het overzicht van naamruimten voor meer informatie.
In dit voorbeeld wordt het XML-voorbeeldbestand van het XML-document gebruikt: meerdere inkooporders in een naamruimte.
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
In dit voorbeeld wordt de volgende uitvoer gegenereerd:
99505