Partilhar via


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 cujo Type 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

Consulte também