Выбор узлов с помощью XPath-навигацииSelect Nodes Using XPath Navigation

Модель DOM содержит методы, позволяющие использовать навигацию языка XPath для запроса данных в модели DOM.The XML Document Object Model (DOM) contains methods that allow you to use XML Path Language (XPath) navigation to query information in the DOM. Язык XPath используется для поиска конкретного одиночного узла или всех узлов, соответствующих некоторым условиям.You can use XPath to find a single, specific node or to find all nodes that match some criteria.

Методы выбора XPathXPath Select Methods

Классы DOM предоставляют два способа выбора XPath: метод SelectSingleNode и метод SelectNodes.The DOM classes provide two methods for XPath selection: the SelectSingleNode method and the SelectNodes method. Метод SelectSingleNode возвращает первый узел, соответствующий критериям выбора.The SelectSingleNode method returns the first node that matches the selection criteria. Метод SelectNodes возвращает список XmlNodeList, содержащий соответствующие узлы.The SelectNodes method returns an XmlNodeList that contains the matching nodes.

В следующем примере метод SelectSingleNode используется для выбора первого узла book, в котором фамилия автора соответствует указанному критерию.The following example uses the SelectSingleNode method to select the first book node in which the author's last name meets the specified criteria. Файл bookstore.xml (приведенный в конце этого раздела) используется в качестве входного файла.The bookstore.xml file (which is provided at the end of this topic) is used as the input file.

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

В следующем примере метод SelectNodes используется для выбора всех узлов для книг, где цена превышает указанное значение.The next example uses the SelectNodes method to select all the book nodes in which the price is greater than a specified amount. Затем цена каждой из книг в списке выборки программным способом уменьшается на 10 %.The price for each book in the selected list is then programmatically reduced by ten percent. Наконец, файл с внесенными изменениями выводится на консоль.Finally, the updated file is written to the console. Файл bookstore.xml (приведенный в конце этого раздела) используется в качестве входного файла.The bookstore.xml file (which is provided at the end of this topic) is used as the input file.

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

В вышеприведенных примерах запрос XPath начинается с элемента документа.The examples above start the XPath query at the document element. Указание начальной точки для запроса XPath устанавливает контекстный узел, с которого начинается запрос XPath.Setting the starting point for the XPath query sets the context node, which is the starting point for the XPath query. Если нужно начать не с элемента документа, а с первого дочернего элемента, можно использовать инструкцию выбора следующим образом.If you do not want to start at the document element, but want to start from the first child of the document element, you can code the select statement as follows:

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

Все объекты XmlNodeList синхронизируются с базовым документом.All XmlNodeList objects are synchronized with the underlying document. Поэтому если при проходе по списку узлов изменить значение узла, этот узел также обновляется в исходном документе.Therefore, if you iterate through the node list and modify the value of a node, that node is also updated in the document it came from. В вышеприведенном примере обратите внимание, что при изменении узла в выбранном списке узлов XmlNodeList базовый документ также изменится.Notice in the previous example that when a node is modified in the selected XmlNodeList the underlying document is also modified.

Примечание

При изменении базового документа рекомендуется повторно запустить выбор.When the underlying document is modified, it is advisable to rerun the select. Если изменение узла может привести к его добавлению в список узлов, где он ранее отсутствовал, или удалению из списка узлов, точность списка узлов не гарантируется.If the node modified is one that could cause the node to be added to the node list when it was not previously, or would now cause it to be removed from the node list, there is no guarantee that the node list is now accurate.

Пространства имен в выражениях XPathNamespaces in XPath Expressions

Выражения XPath могут включать пространства имен.XPath expressions can include namespaces. Разрешение пространства имен поддерживается с помощью объекта XmlNamespaceManager.Namespace resolution is supported using the XmlNamespaceManager. Если выражение XPath содержит префикс, этот префикс вместе с URI-кодом пространства имен необходимо добавить к объекту XmlNamespaceManager, и объект XmlNamespaceManager передается методу SelectNodes(String, XmlNamespaceManager) или SelectSingleNode(String, XmlNamespaceManager).If the XPath expression includes a prefix, the prefix and namespace URI pair must be added to the XmlNamespaceManager, and the XmlNamespaceManager is passed to the SelectNodes(String, XmlNamespaceManager) or SelectSingleNode(String, XmlNamespaceManager) method. Обратите внимание, что вышеприведенные примеры кода пользуются диспетчером XmlNamespaceManager для разрешения пространства имен документа bookstore.xml.Notice that the code examples above use the XmlNamespaceManager to resolve the namespace of the bookstore.xml document.

Примечание

Если выражение XPath не содержит префикс, предполагается, что URI-код пространства имен указывает на пустое пространство имен.If the XPath expression does not include a prefix, it is assumed that the namespace Uniform Resource Identifier (URI) is the empty namespace. Если XML включает пространство имен по умолчанию, необходимо добавить префикс вместе с URI-кодом пространства имен к объекту XmlNamespaceManager, в противном случае невозможно будет выбрать узлы.If your XML includes a default namespace, you must still add a prefix and namespace URI to the XmlNamespaceManager; otherwise, no nodes will be selected.

Входной файлInput File

Файл bookstore.xml используется в качестве входного файла в примерах этого раздела.The following is the bookstore.xml file that is used as the input file in the examples in this topic:

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

См. такжеSee also