Výběr uzlů pomocí navigace XPath

Objektový model dokumentu XML (DOM) obsahuje metody, které umožňují použít navigaci jazyka XPath (XML Path Language) k dotazování informací v modelu DOM. Pomocí XPathu můžete najít jeden, konkrétní uzel nebo najít všechny uzly, které splňují určitá kritéria.

XPath Select – metody

Třídy MODELU DOM poskytují dvě metody pro výběr XPath: metodu SelectSingleNode a metodu SelectNodes . Metoda SelectSingleNode vrátí první uzel, který odpovídá kritériím výběru. Metoda SelectNodes vrátí XmlNodeList hodnotu, která obsahuje odpovídající uzly.

Následující příklad používá metodu SelectSingleNode k výběru prvního book uzlu, ve kterém příjmení autora splňuje zadaná kritéria. Jako vstupní soubor se používá bookstore.xml soubor (který je k dispozici na konci tohoto tématu).

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

Následující příklad používá metodu SelectNodes k výběru všech book uzlů, ve kterých je cena větší než zadaná částka. Cena za každou knihu ve vybraném seznamu se pak programově sníží o deset procent. Aktualizovaný soubor se nakonec zapíše do konzoly. Jako vstupní soubor se používá bookstore.xml soubor (který je k dispozici na konci tohoto tématu).

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

Výše uvedené příklady spustí dotaz XPath v elementu dokumentu. Nastavení výchozího bodu dotazu XPath nastaví kontextový uzel, což je výchozí bod pro dotaz XPath. Pokud nechcete začínat na elementu dokumentu, ale chcete začít od prvního podřízeného prvku dokumentu, můžete příkaz select zakódovat následujícím způsobem:

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

Všechny XmlNodeList objekty se synchronizují s podkladovým dokumentem. Proto pokud iterujete seznam uzlů a upravíte hodnotu uzlu, aktualizuje se tento uzel také v dokumentu, ze kterého pochází. Všimněte si v předchozím příkladu, že při úpravě uzlu ve vybraném XmlNodeList podkladovém dokumentu se také změní.

Poznámka:

Po úpravě podkladového dokumentu doporučujeme výběr spustit znovu. Pokud je změněný uzel, který by mohl způsobit přidání uzlu do seznamu uzlů, když nebyl dříve, nebo by ho teď mohl odebrat ze seznamu uzlů, neexistuje žádná záruka, že seznam uzlů je teď přesný.

Obory názvů ve výrazech XPath

Výrazy XPath mohou zahrnovat obory názvů. Překlad oboru názvů se podporuje pomocí metody XmlNamespaceManager. Pokud výraz XPath obsahuje předponu, předpona a pár identifikátoru URI oboru názvů musí být přidán do XmlNamespaceManagera XmlNamespaceManager předá se metodě SelectNodes(String, XmlNamespaceManager) nebo SelectSingleNode(String, XmlNamespaceManager) metodě. Všimněte si, že výše uvedené příklady kódu používají XmlNamespaceManager k vyřešení oboru názvů bookstore.xml dokumentu.

Poznámka:

Pokud výraz XPath neobsahuje předponu, předpokládá se, že obor názvů Uniform Resource Identifier (URI) je prázdný obor názvů. Pokud xml obsahuje výchozí obor názvů, musíte do něj XmlNamespaceManagerpřidat předponu a identifikátor URI oboru názvů, jinak nebudou vybrány žádné uzly.

Vstupní soubor

Následuje bookstore.xml soubor, který se používá jako vstupní soubor v příkladech v tomto tématu:

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

Viz také