Como escrever consultas com filtragem complexa (LINQ to XML)
Muitas vezes, você deseja escrever consultas LINQ to XML com filtros complexos. Por exemplo, você pode ter que localizar todos os elementos que têm um elemento filho com um nome e um valor específicos. Este artigo fornece um exemplo de como escrever uma consulta com filtragem complexa.
Exemplo: localizar com uma consulta aninhada na cláusula Where
Este exemplo mostra como localizar todos os elementos PurchaseOrder
que possuem:
- Um elemento filho
Address
cujo atributoType
é igual a "Envio". - Um elemento filho
State
que é igual a "NY".
Ele usa uma consulta aninhada na cláusula Where
e o operador Any
retornará true
se a coleção tiver elementos nele. O exemplo usa o documento XML Arquivo XML de exemplo: várias ordens de compra.
Para obter mais informações sobre o operador Any
, consulte Operações de quantificador (C#) e Operações de quantificador (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
Esse exemplo gera a saída a seguir:
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: Arquivo XML de exemplo: várias ordens de compra em um 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
Esse exemplo gera a saída a seguir:
99505