Cómo escribir consultas con filtrado complejo

Es posible que desee escribir consultas LINQ to XML con filtros complejos.Por ejemplo, quizás debe buscar todos los elementos que tienen un elemento secundario con un valor y un nombre específicos.En este tema se proporciona un ejemplo de escritura de una consulta con un filtrado complejo.

Ejemplo

En este ejemplo se muestra cómo buscar todos los elementos PurchaseOrder que tienen un elemento Address secundario que tiene un atributo Type igual a "Shipping" (envío) y un elemento State secundario igual a "NY".Utiliza una consulta anidada en la cláusula Where y el operador Any devuelve true si la colección tiene elementos en ella.Para obtener información acerca de la sintaxis de consulta basada en métodos, vea Sintaxis de consultas LINQ y sintaxis de métodos (C#).

Este ejemplo utiliza el siguiente documento XML: Archivo XML de muestra: varios pedidos de compra (LINQ to XML).

Para obtener más información acerca del operador Any, vea Operaciones cuantificadoras.

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 código genera el siguiente resultado:

99505

El siguiente ejemplo muestra la misma consulta sobre un XML que se encuentra en un espacio de nombres.Para obtener más información, vea Trabajar con espacios de nombres XML.

Este ejemplo utiliza el siguiente documento XML: Archivo XML de muestra: varios pedidos de compra en un espacio de nombres.

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

Este código genera el siguiente resultado:

99505

Vea también

Referencia

Propiedades de eje secundario XML (Visual Basic)

Propiedad de eje para atributos XML (Visual Basic)

Value (Propiedad XML) (Visual Basic)

Attribute

Elements

Conceptos

Consultas básicas (LINQ to XML)

Operaciones cuantificadoras

Operaciones de proyección