Jak pisać zapytania ze złożonym filtrowaniem (LINQ to XML)
Czasami chcesz napisać zapytania LINQ to XML ze złożonymi filtrami. Na przykład może być konieczne znalezienie wszystkich elementów, które mają element podrzędny o określonej nazwie i wartości. W tym artykule przedstawiono przykład pisania zapytania ze złożonym filtrowaniem.
Przykład: znajdź z zagnieżdżonym zapytaniem w klauzuli Where
W tym przykładzie pokazano, jak znaleźć wszystkie PurchaseOrder
elementy, które mają:
- Element podrzędny
Address
, któregoType
atrybut jest równy "Wysyłka". - Element podrzędny
State
równy "NY".
Używa zagnieżdżonego zapytania w klauzuli Where
, a Any
operator zwraca true
, jeśli kolekcja zawiera jakiekolwiek elementy. W przykładzie użyto przykładowego pliku XML dokumentu XML: wiele zamówień zakupu.
Aby uzyskać więcej informacji na temat Any
operatora, zobacz Operacje kwantyfikatora (C#) i Operacje kwantyfikatora (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
Ten przykład generuje następujące wyniki:
99505
Przykład: znajdź w formacie XML, który znajduje się w przestrzeni nazw
W poniższym przykładzie pokazano to samo zapytanie co powyżej, ale w przypadku kodu XML, który znajduje się w przestrzeni nazw. Aby uzyskać więcej informacji, zobacz Omówienie przestrzeni nazw.
W tym przykładzie użyto przykładowego pliku XML dokumentu XML: wiele zamówień zakupu w przestrzeni nazw.
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
Ten przykład generuje następujące wyniki:
99505