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 atributo Type é 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

Confira também