Comment utiliser XPath pour sélectionner des nœuds XML – C#
XPath (XML Path Language) est basé sur une représentation DOM d’un document XML. Par conséquent, vous pouvez utiliser XPath pour trouver un ou plusieurs nœuds spécifiques dans un fichier XML qui correspondent à certains critères définis dans l’expression XPath. L’article présente des exemples de sélection des informations requises dans un fichier XML à l’aide de requêtes XPath. Vous apprendrez à naviguer dans un document XML et à sélectionner des nœuds à l’aide de XPath.
Pour apprendre à utiliser la méthode Evaluate() pour naviguer dans un document HTML et sélectionner des nœuds à l’aide d’une requête XPath, veuillez consulter l’article Comment utiliser la méthode XPath – Evaluate().
Vous pouvez télécharger les fichiers de données et les exemples C# complets qui démontrent l’utilisation de la méthode Evaluate() pour les requêtes XPath à partir de GitHub.
Requête XPath – Sélectionner des nœuds dans un fichier XML
Ces exemples montrent comment sélectionner les informations requises dans un fichier XML à l’aide du langage de requête XPath. Examinons le document XML cars.xml. Ce document XML de test contient une base de données de concessionnaires automobiles, leurs numéros de téléphone, leurs noms et une liste des voitures qu’ils possèdent.
Composons séquentiellement des expressions XPath qui sélectionneront des noms, des numéros de téléphone et une liste de voitures qui vous intéressent. XPath est puissant, comme vous le verrez dans les exemples suivants :
Sélectionner tous les nœuds “Dealer” dans le fichier XML
XPath est utilisé de manière programmatique pour évaluer des expressions et sélectionner des nœuds spécifiques dans un document XML. Pour sélectionner des nœuds dans un document XML, utilisez la méthode Evaluate().
Commençons par une requête XPath simple pour tous les nœuds “Dealer” dans le document XML. La requête suivante utilise l’expression XPath //Dealer
. Elle sélectionne tous les éléments Dealer
où qu’ils se trouvent dans le document :
C# code
1var dealers = doc.Evaluate("//Dealer", doc, doc.CreateNSResolver(doc), XPathResultType.Any, null);
JavaScript code
1var dealers = document.evaluate("//Dealer", document, null, XPathResult.ANY_TYPE, null);
Vous pouvez donc sélectionner des informations sur tous les concessionnaires du fichier XML sans aucune restriction. L’expression XPath //Dealer
vous permet de sélectionner tous les nœuds imbriqués nommés “Dealer”.
Sélectionner des nœuds en utilisant des axes XPath – descendant::
Requête XPath avec des limites sur la date de production des voitures
Compliquons la requête XPath et ajoutons une restriction sur l’année de production de la voiture.
Vous pouvez utiliser les axes XPath dans les expressions XPath. Les axes XPath représentent une relation avec le nœud actuel et sont utilisés pour localiser les nœuds relatifs à ce nœud dans l’arbre du document. L’axe descendant
indique tous les enfants du nœud de contexte, tous leurs enfants, et ainsi de suite. En d’autres termes, le descendant sélectionne tous les descendants (enfants, petits-enfants, etc.) du noeud actuel. Par exemple, descendant::Car
sélectionne tous les descendants Car du noeud courant.
Créons donc une expression XPath pour trouver les concessionnaires qui ont une voiture descendant::Car
dont la date de fabrication du modèle est plus récente que 2005 descendant::Model > 2005
. En termes d’arbre DOM, nous recherchons tous les enfants “Dealer” nommés “Car” qui ont un enfant nommé “Model” dont la valeur est supérieure à “2005”. Ce qui suit utilise l’expression XPath //Dealer[descendant::Car[descendant::Model > 2005]]
.
C# code
1var dealers = doc.Evaluate("//Dealer[descendant::Car[descendant::Model > 2005]]", doc, doc.CreateNSResolver(doc), XPathResultType.Any, null);
JavaScript code
1var dealers = document.evaluate("//Dealer[descendant::Car[descendant::Model > 2005]]", document, null, XPathResult.ANY_TYPE, null);
Requête XPath avec des limites sur la date de production et le prix des voitures
Dans l’étape suivante, ajoutons plus de restrictions : introduisons une restriction sur le prix de la voiture et descendant::Prix < 25000
.
L’expression XPath est la suivante //Dealer[descendant::Car[descendant::Model > 2005 and descendant::Price < 25000]]
. Note: les conditions de prix et d’année de fabrication sont combinées avec et
, ce qui signifie que ces deux conditions doivent être exécutées en même temps :
C# code
1var dealers = doc.Evaluate("//Dealer[descendant::Car[descendant::Model > 2005 and descendant::Price < 25000]]", doc, doc.CreateNSResolver(doc), XPathResultType.Any, null);
JavaScript code
1var dealers = document.evaluate("//Dealer[descendant::Car[descendant::Model > 2005 and descendant::Price < 25000]]", document, null, XPathResult.ANY_TYPE, null);
Par conséquent, seuls les concessionnaires ayant une voiture dont la date de fabrication ne dépasse pas 2005 et dont le prix est inférieur à 25 000 euros seront sélectionnés.
Exemple C#, partie 1 – Sélectionner des nœuds à partir d’un fichier XML
Voyons comment sélectionner dans un fichier XML les concessionnaires qui possèdent une voiture dont la date de fabrication ne dépasse pas 2005 et dont le prix est inférieur à 25 000 euros, et comment imprimer les informations requises sur la console. Vous devez suivre quelques étapes :
- Charger un fichier XML existant ( cars.xml).
- Utilisez la méthode
Evaluate() de la classe
Document et transmettez-lui l’expression XPath
//Dealer[descendant::Car[descendant::Model > 2005 and descendant::Price < 25000]]
et d’autres paramètres. - Itère sur les nœuds obtenus et imprime leur contenu sur la console.
- Vous obtiendrez une liste de concessionnaires avec l’ensemble du contenu des nœuds “Dealer”.
1// Use XPath to select nodes from XML
2
3// Create an instance of a document
4using (HTMLDocument doc = new HTMLDocument(Path.Combine(DataDir, "cars.xml")))
5{
6 // Select dealers that match XPath expression
7 IXPathResult dealers = doc.Evaluate("//Dealer[descendant::Car[descendant::Model > 2005 and descendant::Price < 25000]]", doc, doc.CreateNSResolver(doc), XPathResultType.Any, null);
8 Node dealer;
9
10 // Iterate over the selected dealers
11 while ((dealer = dealers.IterateNext()) != null)
12 {
13 Console.WriteLine(dealer.TextContent);
14 }
15}
Exemple C#, partie 2 – Récupérer des informations spécifiques dans les nœuds sélectionnés
Dans la partie précédente de l’exemple, la requête XPath sélectionne tout le contenu du nœud “Dealer” qui correspond à l’expression XPath //Dealer[descendant::Car[descendant::Model > 2005 and descendant::Price < 25000]]
. Mais vous pouvez choisir et imprimer uniquement les informations qui vous intéressent dans l’ensemble du contenu du nœud “Dealer” sélectionné.
Dans cet exemple (
cars.xml), une requête interne a été ajoutée dans la boucle aux nœuds “Dealer” sélectionnés. La requête recueille sous forme de chaîne de caractères les informations relatives au concessionnaire, telles que le “Name” et le “Telephone” : concat('Dealer name : ', Name, 'Telephone : ', Telephone)"
. Faites attention au second paramètre passé à la méthode
Evaluate(expression
, contextNode
, resolver
, type
, result
). Il s’agit du nœud par rapport auquel la requête sera exécutée – le nœud “Dealer” actuel. Cette requête concatène le contenu des nœuds portant les noms “Name” et “Telephone”. Note: la requête utilise le type de résultat attendu de la chaîne de caractères XPathResultType.String
, et la valeur du résultat est obtenue par la propriété StringValue
et non par l’itérateur de noeud.
À la liste des concessionnaires sélectionnés, vous pouvez ajouter l’attribut “CarID”, qui renvoie à une voiture spécifique. Une requête doit être effectuée avec l’expression XPath .//Car[descendant::Model > 2005 and descendant::Price < 25000]/@CarID
. La requête ajoutée présente plusieurs caractéristiques ; examinons-les :
- la requête sélectionne toutes les voitures imbriquées par rapport au nœud courant
.//Car
, et non par rapport à la racine de l’arbre//Car
; - dans l’expression XPath, nous demandons l’attribut
/@CarID
qui nous intéresse pour les voitures sélectionnées.
1// Query and extract XML data using XPath expressions
2
3// Create an instance of a document
4using (HTMLDocument doc = new HTMLDocument(Path.Combine(DataDir, "cars.xml")))
5{
6 // Select dealers that match XPath expression
7 IXPathResult dealers = doc.Evaluate("//Dealer[descendant::Car[descendant::Model > 2005 and descendant::Price < 25000]]", doc, doc.CreateNSResolver(doc), XPathResultType.Any, null);
8 Node dealer;
9
10 // Iterate over the selected dealers
11 while ((dealer = dealers.IterateNext()) != null)
12 {
13 // Get and print Dealer name and Telephone
14 IXPathResult dealerInfo = doc.Evaluate("concat('Dealer name: ', Name/text(), ' Telephone: ', Telephone/text())", dealer, doc.CreateNSResolver(doc), XPathResultType.String, null);
15 Console.WriteLine(dealerInfo.StringValue);
16
17 // Select and print CarID that match XPath expression
18 IXPathResult carIds = doc.Evaluate(".//Car[descendant::Model > 2005 and descendant::Price < 25000]/@CarID", dealer, doc.CreateNSResolver(doc), XPathResultType.Any, null);
19 Node carId;
20
21 while ((carId = carIds.IterateNext()) != null)
22 {
23 Console.WriteLine("Car id: " + carId.TextContent);
24 }
25 }
26}
Nous obtenons ainsi une liste de concessionnaires avec les noms, les téléphones et les codes d’identification des voitures qui nous intéressent.
Aspose.HTML propose des applications Web HTML gratuites qui constituent une collection en ligne de convertisseurs, de fusions, d’outils SEO, de générateurs de code HTML, d’outils URL, et bien plus encore. Les applications fonctionnent sur n’importe quel système d’exploitation doté d’un navigateur web et ne nécessitent aucune installation de logiciel supplémentaire. C’est un moyen rapide et facile de résoudre efficacement vos tâches liées au HTML.