Knooppunten selecteren met XPath-navigatie

Het XML Document Object Model (DOM) bevat methoden waarmee u XML Path Language (XPath)-navigatie kunt gebruiken om query's uit te voeren op informatie in de DOM. U kunt XPath gebruiken om één specifiek knooppunt te vinden of om alle knooppunten te vinden die voldoen aan bepaalde criteria.

XPath-methoden selecteren

De DOM-klassen bieden twee methoden voor XPath-selectie: de SelectSingleNode methode en de SelectNodes methode. De SelectSingleNode methode retourneert het eerste knooppunt dat overeenkomt met de selectiecriteria. De SelectNodes methode retourneert een XmlNodeList die de overeenkomende knooppunten bevat.

In het volgende voorbeeld wordt de SelectSingleNode methode gebruikt om het eerste book knooppunt te selecteren waarin de achternaam van de auteur voldoet aan de opgegeven criteria. Het bookstore.xml-bestand (dat aan het einde van dit onderwerp is opgegeven) wordt gebruikt als het invoerbestand.

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);  

In het volgende voorbeeld wordt de SelectNodes methode gebruikt om alle boekknooppunten te selecteren waarin de prijs groter is dan een opgegeven bedrag. De prijs voor elk boek in de geselecteerde lijst wordt vervolgens programmatisch verlaagd met tien procent. Ten slotte wordt het bijgewerkte bestand naar de console geschreven. Het bookstore.xml-bestand (dat aan het einde van dit onderwerp is opgegeven) wordt gebruikt als het invoerbestand.

' 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);  

De bovenstaande voorbeelden starten de XPath-query op het documentelement. Als u het beginpunt voor de XPath-query instelt, wordt het contextknooppunt ingesteld. Dit is het startpunt voor de XPath-query. Als u niet wilt beginnen bij het documentelement, maar wilt beginnen vanaf het eerste onderliggende element van het documentelement, kunt u de select-instructie als volgt coderen:

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

Alle XmlNodeList objecten worden gesynchroniseerd met het onderliggende document. Als u de knooppuntlijst doorloopt en de waarde van een knooppunt wijzigt, wordt dat knooppunt ook bijgewerkt in het document waaruit het knooppunt afkomstig is. U ziet in het vorige voorbeeld dat wanneer een knooppunt wordt gewijzigd in het geselecteerde onderliggende XmlNodeList document ook wordt gewijzigd.

Notitie

Wanneer het onderliggende document wordt gewijzigd, is het raadzaam om de selectie opnieuw uit te proberen. Als het knooppunt is gewijzigd dat het knooppunt kan worden toegevoegd aan de lijst met knooppunten wanneer het nog niet eerder was, of dat het nu uit de lijst met knooppunten zou worden verwijderd, is er geen garantie dat de knooppuntlijst nu juist is.

Naamruimten in XPath-expressies

XPath-expressies kunnen naamruimten bevatten. Naamruimteomzetting wordt ondersteund met behulp van de XmlNamespaceManager. Als de XPath-expressie een voorvoegsel bevat, moeten het voorvoegsel en het naamruimte-URI-paar worden toegevoegd aan het XmlNamespaceManageren de XmlNamespaceManager methode worden doorgegeven aan de SelectNodes(String, XmlNamespaceManager) of SelectSingleNode(String, XmlNamespaceManager) methode. In de bovenstaande codevoorbeelden wordt de XmlNamespaceManager naamruimte van het bookstore.xml document omgezet.

Notitie

Als de XPath-expressie geen voorvoegsel bevat, wordt ervan uitgegaan dat de naamruimte Uniform Resource Identifier (URI) de lege naamruimte is. Als uw XML een standaardnaamruimte bevat, moet u nog steeds een voorvoegsel en naamruimte-URI toevoegen aan de XmlNamespaceManager. Anders worden er geen knooppunten geselecteerd.

Invoerbestand

Hier volgt het bookstore.xml bestand dat wordt gebruikt als invoerbestand in de voorbeelden in dit onderwerp:

<?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>  

Zie ook