Cómo recorrer XML con la clase XPathNavigator utilizando Visual C#

Para obtener una versión de este artículo para Microsoft Visual Basic .NET, consulte 301111 .


Este artículo hace referencia a los siguientes espacios de nombres de la Biblioteca de clases de Microsoft .NET Framework:

  • System.Xml
  • System.Xml.XPath

En esta tarea

Resumen

En este artículo paso a paso se describe cómo recorrer documentos del Lenguaje de marcado extensible (XML) con un objeto XPathNavigator creado a partir de un objeto XPathDocument. En este ejemplo se carga un objeto XPathDocument con datos XML, se crea un objeto XPathNavigator como una vista de los datos y se muestra el código XML recorriendo el documento.


Requisitos

En la lista siguiente se describe el hardware, el software, la infraestructura de red y los Service Packs recomendados que necesitará:
  • Microsoft Visual C# .NET o Microsoft Visual C# 2005
En el presente artículo se da por supuesto que está familiarizado con los temas siguientes:
  • Terminología de XML
  • Crear y leer un archivo XML
  • Sintaxis de XML Path Language (XPath)

Cómo utilizar la clase XpathNavigator para recorrer XML

  1. Cree una nueva aplicación de consola de Visual C# en Visual Studio NET o Microsoft Visual Studio 2005.

    NOTA: Este ejemplo utiliza un archivo llamado Books.xml. Puede crear su propio archivo Books.xml o puede utilizar el ejemplo que se incluye en los Tutoriales del Kit de desarrollo de software (SDK) de .NET. Si no tiene los Tutoriales instalados y no desea instalarlos, consulte la sección "Referencias" para ver la ubicación de descarga del archivo Books.xml. Si tiene los Tutoriales instalados, el archivo Books.xml se encuentra ubicado en la siguiente carpeta:
    \Archivos de programa\Microsoft.NET\FrameworkSDK\Samples\Quickstart\Howto\Samples\Xml\Transformxml\VB
    Debe copiar el archivo Books.xml en la carpeta \Bin\Debug que se encuentra bajo la carpeta en la que creó este proyecto.
  2. Asegúrese de que el proyecto hace referencia al espacio de nombres System.Xml.
  3. Utilice la instrucción using de los espacios de nombres Xml y XPath de forma que no tenga que suministrar declaraciones de dichos espacios de nombres más adelante en el código. Debe utilizar la instrucción using antes que cualquier otra declaración, de la manera siguiente:
    using System.Xml; using System.Xml.XPath;
  4. Declare las variables apropiadas. Declare un objeto XPathDocument para que contenga el documento XML y un objeto XPathNavigator para evaluar expresiones XPath y desplazarse por el documento. Declare un objeto String para almacenar la expresión XPath. Agregue el código de declaración al procedimiento Main de Module1.
    XPathNavigator nav; XPathDocument docNav;
  5. Cargue un objeto XPathDocument con el archivo de ejemplo Books.xml. La clase XPathDocument utiliza Transformaciones del Lenguaje de hoja de estilos extensible (XSLT) para proporcionar una memoria caché rápida orientada al rendimiento para procesar documentos XML. Es similar al Modelo de objetos de documentos (DOM) de XML, pero está muy optimizado para procesar XSLT y el modelo de datos XPath.
    // Abrir el XML. docNav = new XPathDocument(@"c:\books.xml");
  6. Cree un objeto XPathNavigator a partir del documento. XPathNavigator le permite recorrer los nodos de atributos y de espacios de nombres de un documento XML.
    // Crear un explorador para consultar con XPath. nav = docNav.CreateNavigator();
  7. Vaya a la raíz del documento con el método MoveToRoot. MoveToRoot configura el explorador para ir al nodo de documentos que contiene todo el árbol de nodos.
    //XPathNavigator inicial para empezar en la raíz. nav.MoveToRoot();
  8. Utilice el método MoveToFirstChild para ir a los nodos secundarios del documento XML. El método MoveToFirstChild va al primer nodo secundario del nodo actual. En el caso del origen del archivo Books.xml, se aleja del documento raíz hacia los secundarios, la sección Comentarios y el nodo Librería (Bookstore).
    //Ir al primer nodo secundario (campo de comentarios). nav.MoveToFirstChild();
  9. Utilice el método MoveToNext para recorrer los nodos en el mismo nivel. El método MoveToNext va al siguiente elemento relacionado del nodo actual.
    //Recorrer en bucle todos los nodos raíz. do {

    } while (nav.MoveToNext());
  10. Utilice la propiedad NodeType para asegurarse de que sólo está procesando nodos de elementos y la propiedad Value para mostrar la representación de texto del elemento.
    do { //Buscar el primer elemento. if (nav.NodeType == XPathNodeType.Element) {

    //Determinar si existen elementos secundarios. if (nav.HasChildren == true) {

    //Ir al primer elemento secundario. nav.MoveToFirstChild();

    //Recorrer en bucle todos los elementos secundarios. do {//Mostrar los datos. Console.Write("La cadena XML para este elemento secundario "); Console.WriteLine("es '{0}'", nav.Value);

    } while (nav.MoveToNext()); } } } while (nav.MoveToNext());
  11. Utilice la propiedad HasAttributes para determinar si un nodo tiene o no atributos. También puede utilizar otros métodos, como MoveToNextAttribute, para ir a un atributo y examinar su valor. Tenga en cuenta que este segmento de código sólo va por los descendientes del nodo raíz, no por todo el árbol.
    do { //Buscar el primer elemento. if (nav.NodeType == XPathNodeType.Element) { //si existen elementos secundarios if (nav.HasChildren == true) {

    //Ir al primer elemento secundario. nav.MoveToFirstChild();

    //Recorrer en bucle todos los elementos secundarios. do {//Mostrar los datos. Console.Write("La cadena XML para este elemento secundario "); Console.WriteLine("es '{0}'", nav.Value);

    //Comprobar atributos. if (nav.HasAttributes == true) { Console.WriteLine("Este nodo tiene atributos"); } } while (nav.MoveToNext()); } } } while (nav.MoveToNext());
  12. Utilice el método ReadLine del objeto Console para agregar una pausa al final de la presentación de la consola y mostrar mejor los resultados anteriores.
    //Pausa. Console.ReadLine();
  13. Genere y ejecute el proyecto de Visual C#.

Listado de código completo

using System; using System.Xml; using System.Xml.XPath;

namespace q308343 { class Class1 { static void Main(string[] args){

XPathNavigator nav; XPathDocument docNav;

docNav = new XPathDocument(@"c:\books.xml"); nav = docNav.CreateNavigator(); nav.MoveToRoot();

//Ir al primer nodo secundario (campo de comentarios). nav.MoveToFirstChild();

do { //Buscar el primer elemento. if (nav.NodeType == XPathNodeType.Element) { //Determinar si existen elementos secundarios. if (nav.HasChildren == true) {

//Ir al primer elemento secundario. nav.MoveToFirstChild();

//Recorrer en bucle todos los elementos secundarios. do {//Mostrar los datos. Console.Write("La cadena XML para este elemento secundario "); Console.WriteLine("es '{0}'", nav.Value);

//Comprobar atributos. if (nav.HasAttributes == true) { Console.WriteLine("Este nodo tiene atributos"); } } while (nav.MoveToNext()); } } } while (nav.MoveToNext()); //Pausa. Console.ReadLine(); } }

}

Solución de problemas

Cuando pruebe el código quizás aparezca el mensaje de error de excepción siguiente:

Excepción no controlada del tipo 'System.Xml.XmlException' en system.xml.dll

Información adicional: Error del sistema.
El error de excepción se produce en la siguiente línea de código:
docNav = new XPathDocument("c:\\books.xml");
El error de excepción se debe a una instrucción de procesamiento no válida. Por ejemplo, la instrucción de procesamiento puede contener espacios extraños. A continuación se muestra un ejemplo de una instrucción de procesamiento no válida:
<?xml version='1.0' ?>
Para resolver la excepción, realice una de las siguientes acciones:
  • Corrija la instrucción de procesamiento no válida. A continuación se muestra un ejemplo de instrucción de procesamiento válida:

    <?xml version='1.0'?>
    O bien

  • Quite la instrucción de procesamiento XML del archivo Books.xml.

Referencias

El siguiente archivo se puede descargar desde el Centro de descarga de Microsoft:
Para obtener más información, visite los siguientes sitios Web de Microsoft:

Para obtener más información acerca de XPath, visite el siguiente sitio Web de World Wide Web Consortium (W3C):

XML Path Language (XPath)
Versión 1.0: W3C Recommendation 16 November 1999
http://www.w3.org/TR/1999/REC-xpath-19991116
Propiedades

Id. de artículo: 308343 - Última revisión: 3 oct. 2006 - Revisión: 1

Comentarios