Share via


Procedimiento para escribir consultas con filtrado complejo (LINQ to XML)

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 artículo se proporciona un ejemplo de escritura de una consulta con filtrado complejo.

Ejemplo: Búsqueda con una consulta anidada en la cláusula Where

En este ejemplo se muestra cómo buscar todos los elementos PurchaseOrder que tienen:

  • Un elemento secundario Address cuyo atributo Type es igual a "Shipping".
  • Un elemento secundario State que es 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. En el ejemplo se usa el documento XML Archivo XML de ejemplo: varios pedidos de compra.

Para obtener más información sobre el operador Any, vea Operaciones cuantificadoras (C#) y Operaciones de cuantificador (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 ejemplo produce el siguiente resultado:

99505

Ejemplo: Búsqueda en XML que se encuentra en un espacio de nombres

En el siguiente ejemplo se muestra la misma consulta que arriba, pero para XML que se encuentra en un espacio de nombres. Para obtener más información, vea Introducción a los espacios de nombres.

En este ejemplo se usa el documento XML: Archivo XML de ejemplo: varios pedidos de compra en un espacio de nombres.

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 ejemplo produce el siguiente resultado:

99505

Consulte también