Anteckning
Åtkomst till den här sidan kräver auktorisering. Du kan prova att logga in eller ändra kataloger.
Åtkomst till den här sidan kräver auktorisering. Du kan prova att ändra kataloger.
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
Addresselement varsTypeattribut är lika med "Shipping". - Ett underordnat
Stateelement 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