Compartir a través de


Consultar XML con una expresión XPath en Visual C#

En este artículo se describe cómo consultar un XPathDocument objeto mediante una expresión de lenguaje de ruta de acceso XML (XPath) y la XPathNavigator clase .

XPath se usa mediante programación para evaluar expresiones y seleccionar nodos específicos en un documento.

En este artículo se hace referencia al espacio de nombres de la biblioteca de clases de Microsoft .NET Framework, System.Xml.XPath.

Se aplica a: Visual Studio, .NET Framework

Número de KB original: 308333

Prerrequisitos

En este artículo se da por supuesto que está familiarizado con los temas siguientes:

  • Visual C#
  • Terminología XML
  • Creación y lectura de un archivo XML
  • Sintaxis XPath

Consulta un XPathDocument que contiene una expresión XPath

  1. En Microsoft Visual Studio, cree una aplicación de consola de Visual C#.

    Nota:

    En este ejemplo se usa un archivo denominado Books.xml. Puede crear su propio archivo de Books.xml o puede usar el ejemplo que se incluye con los inicios rápidos del Kit de desarrollo de software (SDK) de .NET.

    Si no tiene instalados los inicios rápidos y no quiere instalarlos, consulte la sección "Contenido relacionado" para la ubicación de descarga de Books.xml.

    Si tiene instalados los inicios rápidos, el archivo Books.xml se puede encontrar en la Program Files\Microsoft.NET\FrameworkSDK\Samples\Quickstart\Howto\Samples\Xml\Transforxml\VB carpeta . Puede copiar el archivo en la \Bin\Debug subcarpeta de la carpeta en la que creó este proyecto.

  2. Asegúrese de que el proyecto hace referencia al System.Xml espacio de nombres.

  3. Use la using instrucción en los Xml espacios de nombres y XPath para que no sea necesario calificar las declaraciones en esos espacios de nombres más adelante en el código. Puede usar la using instrucción antes de cualquier otra declaración, como se indica a continuación:

    using System.Xml;
    using System.Xml.XPath;
    
  4. Declare las variables adecuadas. Declare un XPathDocument objeto para contener el documento XML, un XpathNavigator objeto para evaluar expresiones XPath y un XPathNodeIterator objeto para recorrer en iteración los nodos seleccionados. Declare un String objeto para contener las expresiones XPath. Agregue el código de declaración a la Main función en Class1.

    XPathNavigator nav;
    XPathDocument docNav;
    XPathNodeIterator NodeIter;
    String strExpression;
    
  5. Cargue un XPathDocument junto con el archivo de ejemplo, Books.xml. La XPathDocument clase usa Transformaciones de lenguaje de hoja de estilos extensibles (XSLT) para proporcionar una caché rápida y orientada al rendimiento para el procesamiento de documentos XML. Es similar al modelo de objetos de documento XML (DOM), pero está altamente optimizado para el procesamiento XSLT y el XPath modelo de datos.

    // Open the XML.
    docNav = new XPathDocument(@"c:\books.xml");
    
  6. Cree un XPathNavigator elemento a partir del documento. El XPathNavigator objeto se usa para consultas XPath de solo lectura. Las consultas XPath pueden devolver un valor resultante o muchos nodos.

    // Create a navigator to query with XPath.
    nav = docNav.CreateNavigator();
    
  7. Cree una expresión XPath para encontrar el costo medio de un libro. Esta expresión XPath devuelve un valor único. Para obtener información completa sobre la sintaxis XPath, vea Sintaxis XPath en la sección "Referencias".

    // Find the average cost of a book.
    // This expression uses standard XPath syntax.
    strExpression = "sum(/bookstore/book/price) div count(/bookstore/book/price)";
    
  8. Use el Evaluate método del XPathNavigator objeto para evaluar la expresión XPath. El Evaluate método devuelve los resultados de la expresión.

    // Use the Evaluate method to return the evaluated expression.
    Console.WriteLine("The average cost of the books are {0}", nav.Evaluate(strExpression));
    
  9. Cree una expresión XPath para encontrar todos los libros que cuestan más de 10 dólares. Esta expresión XPath devuelve solo los nodos title del origen XML.

    // Find the title of the books that are greater then $10.00.
    strExpression = "/bookstore/book/title[../price>10.00]";
    
  10. Cree un XPathNodeIterator para los nodos seleccionados junto con el método Select de XPathNavigator. XPathNodeIterator representa un conjunto de nodos XPath y admite operaciones en este conjunto de nodos.

    // Select the node and place the results in an iterator.
    NodeIter = nav.Select(strExpression);
    
  11. Para desplazarse por los nodos seleccionados, use el XPathNodeIterator que se devolvió desde el Select método de XPathNavigator. En este caso, puede usar el MoveNext método de XPathNodeIterator para recorrer en iteración todos los nodos seleccionados.

    Console.WriteLine("List of expensive books:");
    //Iterate through the results showing the element value.
    while (NodeIter.MoveNext())
    {
        Console.WriteLine("Book Title: {0}", NodeIter.Current.Value);
    };
    
  12. Use el ReadLine método para agregar una pausa al final de la pantalla de la consola para mostrar más fácilmente los resultados de los pasos anteriores.

    // Pause
    Console.ReadLine();
    
  13. Compile y ejecute el proyecto.

    Nota:

    Los resultados se muestran en la ventana de la consola.

Solución de problemas

Al probar el código, es posible que reciba el siguiente mensaje de error de excepción:

An unhandled exception of type System.Xml.XmlException occurred in System.xml.dll  
Additional information: System error.

Esta excepción se produce en la siguiente línea de código:

docNav = new XPathDocument("c:\\books.xml");

El error se debe a una instrucción de procesamiento no válida. Por ejemplo, la instrucción de procesamiento podría contener espacios extraños. El ejemplo siguiente es una instrucción de procesamiento no válida:

<?xml version='1.0' ?>

Para resolver la excepción, use una de las siguientes resoluciones:

  • Corrija la instrucción de procesamiento no válida. El ejemplo siguiente es una instrucción de procesamiento válida:

    <?xml version='1.0'?>
    
  • Quite la instrucción de procesamiento XML del archivo Books.xml.