Como escrever consultas com filtragem complexa (LINQ to XML)
Às vezes, você deseja escrever consultas LINQ to XML com filtros complexos. Por exemplo, talvez seja necessário localizar todos os elementos que tenham um elemento filho com um nome e valor específicos. Este artigo fornece um exemplo de como escrever uma consulta com filtragem complexa.
Exemplo: Localizar com uma consulta aninhada Where
na cláusula
Este exemplo mostra como localizar todos os PurchaseOrder
elementos que possuem:
- Um elemento filho
Address
cujoType
atributo é igual a "Shipping". - Um elemento filho
State
que é igual a "NY".
Ele usa uma consulta aninhada Where
na cláusula e o Any
operador retorna true
se a coleção tiver algum elemento nela. O exemplo usa o documento XML Sample XML file: Multiple purchase orders.
Para obter mais informações sobre o Any
operador, consulte Quantifier Operations (C#) e Quantifier Operations (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
Este exemplo produz a seguinte saída:
99505
Exemplo: Localizar em XML que está em um namespace
O exemplo a seguir mostra a mesma consulta acima, mas para XML que está em um namespace. Para obter mais informações, consulte Visão geral de namespaces.
Este exemplo usa o documento XML Sample XML file: Multiple purchase orders in a namespace.
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
Este exemplo produz a seguinte saída:
99505