Wybieranie węzłów za pomocą nawigacji XPath

Model obiektu dokumentu XML (DOM) zawiera metody, które umożliwiają używanie nawigacji języka ścieżki XML (XPath) do wykonywania zapytań dotyczących informacji w modelu DOM. Za pomocą programu XPath można znaleźć pojedynczy, konkretny węzeł lub znaleźć wszystkie węzły spełniające niektóre kryteria.

XPath Select, metody

Klasy DOM udostępniają dwie metody wyboru XPath: metodę SelectSingleNode i metodę SelectNodes . Metoda SelectSingleNode zwraca pierwszy węzeł zgodny z kryteriami wyboru. Metoda SelectNodes zwraca element XmlNodeList zawierający pasujące węzły.

W poniższym przykładzie użyto SelectSingleNode metody , aby wybrać pierwszy book węzeł, w którym nazwisko autora spełnia określone kryteria. Plik bookstore.xml (który znajduje się na końcu tego tematu) jest używany jako plik wejściowy.

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

W następnym przykładzie użyto SelectNodes metody , aby wybrać wszystkie węzły książki, w których cena jest większa niż określona kwota. Cena każdej książki na wybranej liście jest następnie programowo zmniejszona o dziesięć procent. Na koniec zaktualizowany plik jest zapisywany w konsoli programu . Plik bookstore.xml (który znajduje się na końcu tego tematu) jest używany jako plik wejściowy.

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

Powyższe przykłady rozpoczynają zapytanie XPath w elemecie dokumentu. Ustawienie punktu początkowego dla zapytania XPath ustawia węzeł kontekstu, który jest punktem wyjścia dla zapytania XPath. Jeśli nie chcesz rozpoczynać od elementu dokumentu, ale chcesz zacząć od pierwszego elementu podrzędnego elementu dokumentu, możesz zakodować instrukcję select w następujący sposób:

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

Wszystkie XmlNodeList obiekty są synchronizowane z dokumentem bazowym. W związku z tym jeśli wykonujesz iterację po liście węzłów i zmodyfikujesz wartość węzła, ten węzeł jest również aktualizowany w dokumencie, z którego pochodzi. Zwróć uwagę, że w poprzednim przykładzie, gdy węzeł zostanie zmodyfikowany w wybranym XmlNodeList dokumencie bazowym, również zostanie zmodyfikowany.

Uwaga

Po zmodyfikowaniu dokumentu bazowego zaleca się ponowne uruchomienie zaznacznia. Jeśli zmodyfikowany węzeł jest taki, który może spowodować dodanie węzła do listy węzłów, gdy nie został on wcześniej, lub spowoduje usunięcie go z listy węzłów, nie ma gwarancji, że lista węzłów jest teraz dokładna.

Przestrzenie nazw w wyrażeniach XPath

Wyrażenia XPath mogą zawierać przestrzenie nazw. Rozpoznawanie przestrzeni nazw jest obsługiwane przy użyciu elementu XmlNamespaceManager. Jeśli wyrażenie XPath zawiera prefiks, należy dodać parę identyfikatorów URI prefiksu i przestrzeni nazw do XmlNamespaceManagerklasy , a XmlNamespaceManager parametr jest przekazywany do SelectNodes(String, XmlNamespaceManager) metody or SelectSingleNode(String, XmlNamespaceManager) . Zwróć uwagę, że powyższe przykłady kodu używają XmlNamespaceManager elementu , aby rozpoznać przestrzeń nazw dokumentu bookstore.xml.

Uwaga

Jeśli wyrażenie XPath nie zawiera prefiksu, zakłada się, że przestrzeń nazw Uniform Resource Identifier (URI) jest pustą przestrzenią nazw. Jeśli kod XML zawiera domyślną przestrzeń nazw, nadal musisz dodać prefiks i identyfikator URI przestrzeni nazw do XmlNamespaceManager; w przeciwnym razie nie zostaną wybrane żadne węzły.

Plik wejściowy

Poniżej przedstawiono plik bookstore.xml, który jest używany jako plik wejściowy w przykładach w tym temacie:

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

Zobacz też