Sélection de nœuds à l'aide de la navigation XPath

Le DOM (Document Object Model) XML contient des méthodes permettant d’utiliser la navigation du langage XPath (XML Path) pour demander des informations dans le DOM. Vous pouvez utiliser XPath pour rechercher un nœud simple spécifique ou tous les nœuds qui correspondent à certains critères.

Méthodes de sélection XPath

Les classes DOM offrent deux méthodes pour la sélection XPath : la méthode SelectSingleNode et la méthode SelectNodes. La méthode SelectSingleNode retourne le premier nœud qui correspond aux critères de sélection. La méthode SelectNodes retourne un objet XmlNodeList qui contient les nœuds correspondants.

L'exemple suivant utilise la méthode SelectSingleNode pour sélectionner le premier nœud book dans lequel le nom de l'auteur répond aux critères spécifiés. Le fichier bookstore.xml (qui est fourni à la fin de cette rubrique) est utilisé comme fichier d'entrée.

Dim doc As New XmlDocument()  
doc.Load("bookstore.xml")  
Dim root As XmlNode = doc.DocumentElement  
  
' Add the namespace.  
Dim nsmgr As New XmlNamespaceManager(doc.NameTable)  
nsmgr.AddNamespace("bk", "urn:newbooks-schema")  
  
' Select and display the first node in which the author's
' last name is Kingsolver.  
Dim node As XmlNode = root.SelectSingleNode( _  
     "descendant::bk:book[bk:author/bk:last-name='Kingsolver']", nsmgr)  
Console.WriteLine(node.InnerXml)  
// Load the document and set the root element.  
XmlDocument doc = new XmlDocument();  
doc.Load("bookstore.xml");  
XmlNode root = doc.DocumentElement;  
  
// Add the namespace.  
XmlNamespaceManager nsmgr = new XmlNamespaceManager(doc.NameTable);  
nsmgr.AddNamespace("bk", "urn:newbooks-schema");  
  
// Select and display the first node in which the author's
// last name is Kingsolver.  
XmlNode node = root.SelectSingleNode(  
    "descendant::bk:book[bk:author/bk:last-name='Kingsolver']", nsmgr);  
Console.WriteLine(node.InnerXml);  

L'exemple suivant utilise la méthode SelectNodes pour sélectionner tous les nœuds book dont le prix est supérieur à un montant spécifié. Puis le prix de chaque book dans la liste sélectionnée est réduit à l'aide d'un programme de dix pour cent. Enfin, le fichier mis à jour est écrit dans la console. Le fichier bookstore.xml (qui est fourni à la fin de cette rubrique) est utilisé comme fichier d'entrée.

' Load the document and set the root element.  
Dim doc As New XmlDocument()  
doc.Load("bookstore.xml")  
Dim root As XmlNode = doc.DocumentElement  
  
' Add the namespace.  
Dim nsmgr As New XmlNamespaceManager(doc.NameTable)  
nsmgr.AddNamespace("bk", "urn:newbooks-schema")  
  
' Select all nodes where the book price is greater than 10.00.  
Dim nodeList As XmlNodeList = root.SelectNodes( _  
     "descendant::bk:book[bk:price>10.00]", nsmgr)  
For Each book As XmlNode In nodeList  
     Dim price As Double  
     price = Math.Round(Convert.ToSingle( _  
          book.LastChild.InnerText) * 0.9, 2)  
     book.LastChild.InnerText = price.ToString()  
Next  
  
' Display the updated document.  
doc.Save(Console.Out)  
// Load the document and set the root element.  
XmlDocument doc = new XmlDocument();  
doc.Load("bookstore.xml");  
XmlNode root = doc.DocumentElement;  
  
// Add the namespace.  
XmlNamespaceManager nsmgr = new XmlNamespaceManager(doc.NameTable);  
nsmgr.AddNamespace("bk", "urn:newbooks-schema");  
  
// Select all nodes where the book price is greater than 10.00.  
XmlNodeList nodeList = root.SelectNodes(  
     "descendant::bk:book[bk:price>10.00]", nsmgr);  
foreach (XmlNode book in nodeList)  
{  
     // Discount prices by 10%.  
     double price;  
     price = Math.Round(Convert.ToSingle(  
          book.LastChild.InnerText) * 0.9, 2);  
     book.LastChild.InnerText = price.ToString();  
}  
  
// Display the updated document.  
doc.Save(Console.Out);  

Les exemples ci-dessus commencent la requête XPath à l’élément de document. La définition du point de départ pour la requête XPath définit le nœud de contexte, qui constitue le point de départ de la requête XPath. Si vous ne souhaitez pas commencer à l'élément de document, mais au premier enfant de l'élément de document, vous pouvez coder l'instruction de sélection illustrée comme suit :

doc.DocumentElement.FirstChild.SelectNodes(. . . )  
this doc.DocumentElement.FirstChild.SelectNodes(. . .);  

Tous les objets XmlNodeList sont synchronisés avec le document sous-jacent. Par conséquent, si vous itérez via la liste de nœuds et modifiez la valeur d'un nœud, celui-ci est également mis à jour dans le document dont il provient. Notez que, dans l'exemple précédent, lorsqu'un nœud est modifié dans la classe XmlNodeList sélectionnée, le document sous-jacent est également modifié.

Notes

En cas de modification du document sous-jacent, il est recommandé de réexécuter la sélection. Si le nœud modifié fait partie de ceux qui peuvent entraîner l'ajout du nœud à la liste dans laquelle il ne figure pas encore ou sa suppression de la liste, il n'est pas garanti que la liste de nœuds est à jour.

Espaces de noms dans les expressions XPath

Les expressions XPath peuvent inclure des espaces de noms. La résolution d'espace de noms n'est pas prise en charge par l'objet XmlNamespaceManager. Si l'expression XPath comprend un préfixe, celui-ci et l'URI d'espace de noms doivent être ajoutés à l'objet XmlNamespaceManager et l'objet XmlNamespaceManager est transmis à la méthode SelectNodes(String, XmlNamespaceManager) ou SelectSingleNode(String, XmlNamespaceManager). Remarquez que les exemples de code ci-dessus utilisent le XmlNamespaceManager pour trouver l'espace de noms du document bookstore.xml.

Notes

Si l’expression XPath n’inclut pas de préfixe, l’URI (Uniform Resource Identifier) d’espace de noms est réputé être l’espace de noms vide. Si votre code XML inclut un espace de noms par défaut, vous devez toujours ajouter un préfixe et un URI d'espace de noms à l'objet XmlNamespaceManager ; sinon, aucun nœud n'est sélectionné.

Fichier d'entrée

Le fichier bookstore.xml suivant est utilisé comme fichier d'entrée dans les exemples de cette rubrique :

<?xml version='1.0'?>  
<bookstore xmlns="urn:newbooks-schema">  
  <book genre="novel" style="hardcover">  
    <title>The Handmaid's Tale</title>  
    <author>  
      <first-name>Margaret</first-name>  
      <last-name>Atwood</last-name>  
    </author>  
    <price>19.95</price>  
  </book>  
  <book genre="novel" style="other">  
    <title>The Poisonwood Bible</title>  
    <author>  
      <first-name>Barbara</first-name>  
      <last-name>Kingsolver</last-name>  
    </author>  
    <price>11.99</price>  
  </book>  
  <book genre="novel" style="paperback">  
    <title>The Bean Trees</title>  
    <author>  
      <first-name>Barbara</first-name>  
      <last-name>Kingsolver</last-name>  
    </author>  
    <price>5.99</price>  
  </book>  
</bookstore>  

Voir aussi