Så här skriver du frågor med komplex filtrering (LINQ till XML)
Ibland vill du skriva LINQ till XML-frågor med komplexa filter. Du kan till exempel behöva hitta alla element som har ett underordnat element med ett visst namn och värde. Den här artikeln ger ett exempel på hur du skriver en fråga med komplex filtrering.
Exempel: Hitta med en kapslad fråga i - Where
satsen
Det här exemplet visar hur du hittar alla PurchaseOrder
element som har:
- Ett underordnat
Address
element varsType
attribut är lika med "Shipping". - Ett underordnat
State
element som är lika med "NY".
Den använder en kapslad fråga i Where
-satsen och operatorn Any
returnerar true
om samlingen har några element i den. I exemplet används XML-dokumentexempel-XML-fil : Flera inköpsorder.
Mer information om operatorn finns i Any
Kvantifieraråtgärder (C#) och Kvantifieraråtgärder (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
Det här exemplet genererar följande utdata:
99505
Exempel: Sök i XML som finns i ett namnområde
I följande exempel visas samma fråga som ovan, men för XML som finns i ett namnområde. Mer information finns i Översikt över namnområden.
I det här exemplet används XML-dokumentexempelfil : Flera inköpsorder i ett namnområde.
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
Det här exemplet genererar följande utdata:
99505