Guide pratique pour écrire des requêtes avec un filtrage complexe (LINQ to XML)

Il peut arriver que vous souhaitiez écrire des requêtes LINQ to XML à l'aide de filtres complexes. Par exemple, il se peut que vous deviez rechercher tous les éléments qui ont un élément enfant avec un nom et une valeur spécifiques. Cet article fournit un exemple d’écriture de requête avec un filtrage complexe.

Exemple : rechercher avec une requête imbriquée dans la clause Where

Cet exemple montre comment rechercher tous les éléments PurchaseOrder qui ont :

  • Un élément Address enfant dont l’attribut Type est égal à « Shipping »
  • Un élément State enfant égal à « NY »

Il utilise une sous-requête dans la clause Where et l'opérateur Any retourne true si la collection possède des éléments. Cet exemple utilise le document XML Exemple de fichier XML : plusieurs commandes fournisseur.

Pour plus d’informations sur l’opérateur Any, consultez Opérations de quantificateur (C#) et Opérations de quantificateur (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

Cet exemple produit la sortie suivante :

99505

Exemple : rechercher dans un document XML qui se trouve dans un espace de noms

L’exemple suivant montre la même requête que ci-dessus, mais pour un document XML qui se trouve dans un espace de noms. Pour plus d’informations, consultez Vue d’ensemble des espaces de noms.

Cet exemple utilise le document XML Exemple de fichier XML : plusieurs commandes fournisseur dans un espace de noms.

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

Cet exemple produit la sortie suivante :

99505

Voir aussi