Uso de Visual C# para navegar por documentos XML con la clase XPathNavigator

En este artículo se describe cómo navegar por documentos XML con un XPathNavigator objeto creado a partir de un XPathDocument objeto .

Versión original del producto: Visual C#
Número de KB original: 308343

Resumen

En este ejemplo se carga un XPathDocument objeto con datos XML, se crea un XPathNavigator objeto como una vista en los datos y se muestra el XML caminando por el documento.

En este artículo se hace referencia a los siguientes espacios de nombres de la biblioteca de clases de Microsoft .NET Framework:

  • System.Xml
  • System.Xml.XPath

Para obtener una versión de .NET de Microsoft Visual Basic de este artículo, vea How to navigate XML with the XPathNavigator class by using Visual Basic (Cómo navegar por XML con la clase XPathNavigator mediante Visual Basic).

Requisitos

En este artículo se supone que está familiarizado con los temas siguientes:

  • Visual C#
  • Terminología XML
  • Creación y lectura de un archivo XML
  • Sintaxis del lenguaje de ruta de acceso XML (XPath)

Cómo usar la clase XPathNavigator para navegar por XML

  1. Cree una nueva aplicación de consola de Visual C# en Visual Studio.

    Nota:

    En este ejemplo se usa un archivo denominado Books.xml. Puede crear su propio archivo 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 Referencias de la ubicación deBooks.xml descarga. Si tiene instalados los inicios rápidos, Books.xml se encuentra en la carpeta siguiente:
    \Program Files\Microsoft.NET\FrameworkSDK\Samples\Quickstart\Howto\Samples\Xml\Transformxml\VB

    Puede copiar Books.xml en la \Bin\Debug carpeta que se encuentra en la carpeta en la que creó este proyecto.

  2. Asegúrese de que el proyecto hace referencia al espacio de System.Xml 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 y un XPathNavigator objeto para evaluar XPath las expresiones y desplazarse por el documento. Declare un String objeto para contener la XPath expresión. Agregue el código de declaración en el Main procedimiento en Module1.

    XPathNavigator nav;
    XPathDocument docNav;
    
  5. Cargue un XPathDocument objeto 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 (DOM) XML, pero está altamente optimizado para el procesamiento XSLT y el modelo de datos XPath.

    // Open the XML.
    docNav = new XPathDocument(@"c:\books.xml");
    
  6. Cree un XPathNavigator objeto a partir del documento. XPathNavigator permite desplazarse por los nodos de atributos y los nodos de espacio de nombres de un documento XML.

    // Create a navigator to query with XPath.
    nav = docNav.CreateNavigator();
    
  7. Vaya a la raíz del documento con el MoveToRoot método . MoveToRoot establece el navegador en el nodo de documento que contiene todo el árbol de nodos.

    //Initial XPathNavigator to start at the root.
    nav.MoveToRoot();
    
  8. Use el MoveToFirstChild método para pasar a los elementos secundarios del documento XML. El MoveToFirstChild método se mueve al primer elemento secundario del nodo actual. Si hay el origen deBooks.xml , se aleja del documento raíz a los elementos secundarios, la sección Comentario y el nodo Librería.

    //Move to the first child node (comment field).
    nav.MoveToFirstChild();
    
  9. Use el MoveToNext método para recorrer en iteración los nodos en el nivel del mismo nivel. El MoveToNext método se mueve al siguiente elemento del mismo nivel del nodo actual.

    //Loop through all of the root nodes.
    do
    {
    } while (nav.MoveToNext());
    
  10. Use la NodeType propiedad para asegurarse de que solo procesa nodos de elemento y use la Value propiedad para mostrar la representación de texto del elemento.

    do
    {
       //Find the first element.
       if (nav.NodeType == XPathNodeType.Element)
       {
            //Determine whether children exist.
            if (nav.HasChildren == true)
            {
                //Move to the first child.
                nav.MoveToFirstChild();
    
                //Loop through all the children.
                do
                {
                    //Display the data.
                    Console.Write("The XML string for this child ");
                    Console.WriteLine("is '{0}'", nav.Value);
                } while (nav.MoveToNext());
            }
        }
    } while (nav.MoveToNext());
    
  11. Use la HasAttributes propiedad para determinar si un nodo tiene atributos. También puede usar otros métodos, como MoveToNextAttribute, para pasar a un atributo e inspeccionar su valor.

    Nota:

    Este segmento de código solo recorre los descendientes del nodo raíz y no todo el árbol.

    do
    {
       //Find the first element.
       if (nav.NodeType == XPathNodeType.Element)
       {
            //if children exist
            if (nav.HasChildren == true)
            {
                //Move to the first child.
                nav.MoveToFirstChild();
                //Loop through all the children.
                do
                {
                    //Display the data.
                    Console.Write("The XML string for this child ");
                    Console.WriteLine("is '{0}'", nav.Value);
    
                    //Check for attributes.
                    if (nav.HasAttributes == true)
                    {
                        Console.WriteLine("This node has attributes");
                    }
                } while (nav.MoveToNext());
            }
        }
    } while (nav.MoveToNext());
    
  12. Use el ReadLine método del Console objeto para agregar una pausa al final de la pantalla de la consola para mostrar más fácilmente los resultados anteriores.

    //Pause.
    Console.ReadLine();
    
  13. Compile y ejecute el proyecto de Visual C#.

Lista de código completa

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

            //Move to the first child node (comment field).
            nav.MoveToFirstChild();

            do
            {
                //Find the first element.
                if (nav.NodeType == XPathNodeType.Element)
                {
                    //Determine whether children exist.
                    if (nav.HasChildren == true)
                    {
                        //Move to the first child.
                        nav.MoveToFirstChild();
                        //Loop through all of the children.
                        do
                        {
                            //Display the data.
                            Console.Write("The XML string for this child ");
                            Console.WriteLine("is '{0}'", nav.Value);
                            //Check for attributes.
                            if (nav.HasAttributes == true)
                            {
                                Console.WriteLine("This node has attributes");
                            }
                        } while (nav.MoveToNext());
                    }
                }
            } while (nav.MoveToNext());
            //Pause.
            Console.ReadLine();
        }
    }
}

Solución de problemas

Al probar el código, puede recibir el siguiente mensaje de error de excepción:

Excepción no controlada del tipo System.Xml. XmlException se produjo en system.xml.dll
Información adicional: Declaración XML inesperada. La declaración XML debe ser el primer nodo del documento y no se permite que aparezcan caracteres de espacio en blanco delante de él. Línea 1, posición

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

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

Para resolver el error, quite los caracteres de espacio en blanco que preceden al primer nodo del documento de books.xml.

Referencias