Delen via


Query's schrijven met complexe filters (LINQ naar XML)

Soms wilt u LINQ schrijven naar XML-query's met complexe filters. U moet bijvoorbeeld alle elementen zoeken die een onderliggend element met een bepaalde naam en waarde hebben. Dit artikel bevat een voorbeeld van het schrijven van een query met complexe filters.

Voorbeeld: Zoeken met een geneste query in de Where component

In dit voorbeeld ziet u hoe u alle PurchaseOrder elementen kunt vinden met:

  • Een onderliggend Address element waarvan Type het kenmerk gelijk is aan 'Verzending'.
  • Een onderliggend State element dat gelijk is aan 'NY'.

Er wordt een geneste query in de Where component gebruikt en de Any operator retourneert true of de verzameling elementen bevat. In het voorbeeld wordt een XML-bestand met voorbeeld-XML-documenten gebruikt: Meerdere inkooporders.

Zie Quantifier Operations (C#) en Quantifier Operations (Visual Basic) voor meer informatie over de Any operator.

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

In dit voorbeeld wordt de volgende uitvoer gegenereerd:

99505

Voorbeeld: Zoeken in XML die zich in een naamruimte bevindt

In het volgende voorbeeld ziet u dezelfde query als hierboven, maar voor XML die zich in een naamruimte bevindt. Zie het overzicht van naamruimten voor meer informatie.

In dit voorbeeld wordt het XML-voorbeeldbestand van het XML-document gebruikt: meerdere inkooporders in een naamruimte.

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

In dit voorbeeld wordt de volgende uitvoer gegenereerd:

99505

Zie ook