Selección de nodos con la navegación XPathSelect Nodes Using XPath Navigation

El Modelo de objetos del documento (DOM) XML contiene métodos que le permiten utilizar la navegación del lenguaje de ruta XML (XPath) para consultar información en el 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. Puede utilizar XPath para buscar un solo nodo específico o para buscar todos los nodos que cumplen algunos criterios.You can use XPath to find a single, specific node or to find all nodes that match some criteria.

Métodos de selección de XPathXPath Select Methods

Las clases DOM incluyen dos métodos para la selección de XPath: SelectSingleNode y SelectNodes.The DOM classes provide two methods for XPath selection: the SelectSingleNode method and the SelectNodes method. El método SelectSingleNode devuelve el primer nodo que cumple los criterios de selección.The SelectSingleNode method returns the first node that matches the selection criteria. El método SelectNodes devuelve un XmlNodeList que contiene los nodos coincidentes.The SelectNodes method returns an XmlNodeList that contains the matching nodes.

En el siguiente ejemplo se utiliza el método SelectSingleNode para seleccionar el primer nodo book en el que el apellido del autor cumple los criterios especificados.The following example uses the SelectSingleNode method to select the first book node in which the author's last name meets the specified criteria. El archivo bookstore.xml (que se proporciona al final de este tema) se utiliza como archivo de entrada.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);  

En el ejemplo siguiente, el método SelectNodes se utiliza para seleccionar todos los nodos de libro cuyo precio es mayor que una cantidad dada.The next example uses the SelectNodes method to select all the book nodes in which the price is greater than a specified amount. A continuación, el precio de cada libro de la lista seleccionada se reduce en un diez por ciento mediante programación.The price for each book in the selected list is then programmatically reduced by ten percent. Por último, el archivo actualizado se escribe en la consola.Finally, the updated file is written to the console. El archivo bookstore.xml (que se proporciona al final de este tema) se utiliza como archivo de entrada.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);  

Los ejemplos anteriores comienzan la consulta XPath en el elemento de documento.The examples above start the XPath query at the document element. Al establecer el punto de inicio de la consulta XPath, se establece el nodo de contexto, que es el punto de inicio de la consulta XPath.Setting the starting point for the XPath query sets the context node, which is the starting point for the XPath query. Si no desea comenzar en el elemento de documento, sino en el primer elemento secundario del elemento de documento, puede codificar la instrucción SELECT como se indica a continuación: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(. . .);  

Todos los objetos XmlNodeList se sincronizan con el documento subyacente.All XmlNodeList objects are synchronized with the underlying document. Por lo tanto, si itera a través de la lista de nodos y modifica el valor de un nodo, ese nodo también se actualiza en el documento del que proviene.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. En el ejemplo anterior observe que cuando se modifica un nodo en el objeto XmlNodeList seleccionado, se modifica también el documento subyacente.Notice in the previous example that when a node is modified in the selected XmlNodeList the underlying document is also modified.

Nota

Cuando se modifica el documento subyacente, es aconsejable volver a ejecutar la selección.When the underlying document is modified, it is advisable to rerun the select. Si el nodo modificado puede provocar que el nodo se agregue a la lista de nodos cuando antes no estaba, o que se quite de la lista de nodos, no hay ninguna garantía de que la lista de nodos sea precisa.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.

Espacios de nombres en expresiones XPathNamespaces in XPath Expressions

Las expresiones XPath pueden incluir espacios de nombres.XPath expressions can include namespaces. La resolución de espacios de nombres es compatible con XmlNamespaceManager.Namespace resolution is supported using the XmlNamespaceManager. Si la expresión XPath incluye un prefijo, el par del prefijo y el identificador URI de espacio de nombres se debe agregar a XmlNamespaceManager, y XmlNamespaceManager se pasa al método SelectNodes(String, XmlNamespaceManager) o 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. Observe que los ejemplos de código anteriores utilizan XmlNamespaceManager para resolver el espacio de nombres del documento bookstore.xml.Notice that the code examples above use the XmlNamespaceManager to resolve the namespace of the bookstore.xml document.

Nota

Si la expresión XPath no incluye un prefijo, se asume que el identificador uniforme de recursos (URI) de espacio de nombres es el espacio de nombres vacío.If the XPath expression does not include a prefix, it is assumed that the namespace Uniform Resource Identifier (URI) is the empty namespace. Si el XML incluye un espacio de nombres predeterminado, deberá agregar también un prefijo y un identificador URI de espacio de nombres a XmlNamespaceManager; de lo contrario, no se seleccionará ningún nodo.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.

Archivo de entradaInput File

A continuación, se muestra el archivo bookstore.xml que se utiliza como archivo de entrada en los ejemplos incluidos en este tema: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>  

Vea tambiénSee also