Partilhar via


Como escrever consultas com filtragem complexa

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 tópico dá um exemplo de como escrever uma consulta com filtragem complexa.

Exemplo

Este exemplo mostra como localizar todos os elementos PurchaseOrder que têm um elemento filho Address que têm um atributo Type igual a “Shipping” e um elemento filho State 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. Para obter informações sobre como usar a sintaxe da consulta com base em método, consulte Sintaxe de consulta e sintaxe de método em LINQ (C#).

Este exemplo usa o seguinte documento XML: Arquivo XML de exemplo: várias ordens de compra (LINQ to XML).

Para obter mais informações sobre o operador Any, consulte Operações de quantificador.

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 código gera a seguinte saída:

99505

O exemplo a seguir mostra a mesma consulta para XML que está em um namespace. Para obter mais informações, consulte Trabalhando com namespaces XML.

Este exemplo usa o seguinte documento XML: Exemplo do arquivo XML: Várias ordens de compra em um namespace.

XElement root = XElement.Load("PurchaseOrdersInNamespace.xml");
XNamespace aw = "https://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='https://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 código gera a seguinte saída:

99505

Consulte também

Referência

Propriedade do eixo filho XML (Visual Basic)

Propriedade de eixo do atributo XML (Visual Basic)

Propriedade do valor XML (Visual Basic)

Attribute

Elements

Conceitos

Consultas básicas (LINQ to XML)

Operações de quantificador

Operações de projeção