Välj noder med XPath-navigering

XML-dokumentobjektmodellen (DOM) innehåller metoder som gör att du kan använda XPath-navigering (XML Path Language) för att fråga efter information i DOM. Du kan använda XPath för att hitta en enskild, specifik nod eller för att hitta alla noder som matchar vissa villkor.

XPath Select-metoder

DOM-klasserna innehåller två metoder för XPath-val: SelectSingleNode metoden och SelectNodes metoden. Metoden SelectSingleNode returnerar den första noden som matchar urvalsvillkoren. Metoden SelectNodes returnerar en XmlNodeList som innehåller matchande noder.

I följande exempel används SelectSingleNode metoden för att välja den första book noden där författarens efternamn uppfyller de angivna kriterierna. Den bookstore.xml filen (som tillhandahålls i slutet av det här avsnittet) används som indatafil.

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

I nästa exempel används SelectNodes metoden för att välja alla boknoder där priset är större än ett angivet belopp. Priset för varje bok i den valda listan sänks sedan programmatiskt med tio procent. Slutligen skrivs den uppdaterade filen till konsolen. Den bookstore.xml filen (som tillhandahålls i slutet av det här avsnittet) används som indatafil.

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

Exemplen ovan startar XPath-frågan i dokumentelementet. Om du anger startpunkten för XPath-frågan anges kontextnoden, som är startpunkten för XPath-frågan. Om du inte vill börja med dokumentelementet, men vill börja från det första underordnade i dokumentelementet, kan du koda select-instruktionen på följande sätt:

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

Alla XmlNodeList objekt synkroniseras med det underliggande dokumentet. Om du itererar genom nodlistan och ändrar värdet för en nod uppdateras den noden också i dokumentet som den kom från. Observera i föregående exempel att när en nod ändras i det valda XmlNodeList underliggande dokumentet ändras också.

Kommentar

När det underliggande dokumentet ändras rekommenderar vi att du kör valet igen. Om den ändrade noden är en nod som kan göra att noden läggs till i nodlistan när den inte var tidigare, eller om den nu skulle tas bort från nodlistan, finns det ingen garanti för att nodlistan nu är korrekt.

Namnområden i XPath-uttryck

XPath-uttryck kan innehålla namnområden. Namnområdesmatchning stöds med hjälp av XmlNamespaceManager. Om XPath-uttrycket innehåller ett prefix måste prefixet och namnområdets URI-par läggas till i XmlNamespaceManager, och XmlNamespaceManager skickas till SelectNodes(String, XmlNamespaceManager) metoden eller SelectSingleNode(String, XmlNamespaceManager) . Observera att kodexemplen ovan använder XmlNamespaceManager för att matcha namnområdet för bookstore.xml dokumentet.

Kommentar

Om XPath-uttrycket inte innehåller något prefix antas det att namnområdets enhetliga resursidentifierare (URI) är det tomma namnområdet. Om xml-koden innehåller ett standardnamnområde måste du fortfarande lägga till ett prefix och en namnområdes-URI i XmlNamespaceManager. Annars väljs inga noder.

Indatafil

Följande är den bookstore.xml fil som används som indatafil i exemplen i det här avsnittet:

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

Se även