Condividi tramite


Come scrivere query con filtri complessi (LINQ to XML)

A volte si desidera scrivere query LINQ to XML con filtri complessi. Può ad esempio essere necessario trovare tutti gli elementi che hanno un elemento figlio con un determinato nome e valore. In questo articolo viene illustrato come scrivere una query di esempio con filtri complessi.

Esempio: Eseguire una ricerca con una query annidata nella clausola Where

In questo esempio viene illustrato come trovare tutti gli elementi PurchaseOrder con:

  • Un elemento figlio Address il cui attributo Type è uguale a "Shipping".
  • Un elemento figlio State uguale a "NY".

Viene usata una query annidata nella clausola Where e l'operatore Any restituisce true se la raccolta contiene elementi. Per questo esempio viene usato il documento XML File XML di esempio: più ordini di acquisto.

Per altre informazioni sull'operatore Any, vedere Operazioni del quantificatore (C#) e Operazioni del quantificatore (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

Nell'esempio viene prodotto l'output seguente:

99505

Esempio: Eseguire una ricerca in XML che si trova in uno spazio dei nomi

Nell'esempio seguente viene illustrata la stessa query riportata sopra ma per XML che si trova in uno spazio dei nomi. Per altre informazioni, vedere Panoramica degli spazi dei nomi.

Nell'esempio viene usato il documento XML File XML di esempio: più ordini di acquisto in uno spazio dei nomi.

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

Nell'esempio viene prodotto l'output seguente:

99505

Vedi anche