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’attributType
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