Как создавать запросы с помощью сложной фильтрации (LINQ to XML)
Иногда возникает необходимость в написании запросов LINQ to XML с комплексной фильтрацией. Например, может потребоваться найти все элементы, имеющие дочерние элементы с определенным именем и значением. В этой статье приведен пример написания запроса с помощью сложной фильтрации.
Пример. Поиск с вложенным запросом в предложении Where
В этом примере показано, как найти все PurchaseOrder
элементы, имеющие:
- Дочерний
Address
элемент, атрибут которогоType
равен "Shipping". - Дочерний
State
элемент, равный "NY".
В нем используется вложенный запрос в предложении Where
, а оператор Any
возвращает значение true
, если коллекция содержит элементы. В примере используется XML-файл XML-документа Sample XML: несколько заказов на покупку.
Дополнительные сведения об операторе Any
см. в разделе "Операции квантификатора" (C#) и "Квантификатор" (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
В примере получается следующий вывод.
99505
Пример: поиск в XML, который находится в пространстве имен
В следующем примере показан тот же запрос, что и выше, но для XML, который находится в пространстве имен. Дополнительные сведения см. в обзоре пространств имен.
В этом примере используется XML-файл SAMPLE XML: несколько заказов на покупку в пространстве имен.
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
В примере получается следующий вывод.
99505