Leer los datos XML de un archivo mediante Visual C++

En este artículo se muestra cómo usar la XmlTextReader clase para leer los datos XML de un archivo.

Versión del producto original:   Visual C++
Número de KB original:   815658

Resumen

En este artículo se describe cómo usar la XmlTextReader clase para leer los datos XML de un archivo. La XmlTextReader clase proporciona análisis directo y encadenamiento de los datos XML. La XmlTextReader clase también implementa la especificación xml 1,0, además de los espacios de nombres, en la especificación XML definida por el Consorcio World Wide Web (W3C). En este artículo se describe cómo realizar un acceso de secuencia con tokens rápido a los datos XML en lugar de usar un modelo de objetos, como el modelo de objetos de documento (DOM) XML.

Para obtener una versión de Microsoft Visual C# .NET de este artículo, vea cómo leer XML de un archivo con Visual c#.

Este artículo hace referencia al siguiente espacio de nombres de la biblioteca de clases de Microsoft .NET Framework: System.xml

Requirements

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

  • Terminología XML
  • Cómo crear y cómo leer un archivo XML

En la siguiente lista se describen el hardware, el software, la infraestructura de red y los Service Pack recomendados que necesita:

  • Microsoft Visual Studio .NET
  • Microsoft Visual Studio 2005

Leer los datos XML de un archivo

En el ejemplo de este artículo se usa un archivo que se denomina Books.xml. Puede crear su propio Books.xml archivo o puede usar el archivo de ejemplo que se incluye en QuickStarts para el kit de desarrollo de software (SDK) de Microsoft .NET. Debe copiar el archivo de Books.xml en la carpeta del proyecto.

Para leer los datos XML de un archivo, siga estos pasos:

  1. Inicie Visual Studio .NET 2002, Visual Studio .NET 2003 o Visual Studio 2005.

  2. En el menú Archivo, elija Nuevo y, a continuación, haga clic en Proyecto.

    A continuación aparece el cuadro de diálogo Nuevo proyecto.

  3. En tipos de proyecto, haga clic en proyectos de Visual C++.

    Nota

    En Visual Studio 2005, los proyectos de Visual c++ se cambian a Visual c++.

  4. En plantillas, haga clic en aplicación de C++ administrada si está utilizando Visual Studio .net 2002.

    En plantillas, haga clic en aplicación de consola (.net) si utiliza Visual Studio .NET 2003.

    En plantillas, haga clic en aplicación de consola CLR si usa Visual Studio 2005.

  5. En el cuadro nombre , escriba Q815658y, a continuación, haga clic en Aceptar.

  6. Agregar una referencia a System.xml.dll en el proyecto. Para obtener más información acerca de cómo agregar referencias a un proyecto de Visual C++ administrado, vea Agregar referencias a un proyecto administrado de Visual c++ .

  7. Especifique la directiva using en el System::Xml espacio de nombres de la siguiente manera:

    using namespace System::Xml;
    

    Esto se hace para que no sea necesario calificar las XmlTextReader declaraciones de clase más adelante en el código. Debe usar la directiva using antes de cualquier otra declaración.

  8. Cree una instancia del XmlTextReader objeto. Rellene el XmlTextReader objeto con el archivo. Xml.

    Normalmente, la XmlTextReader clase se usa si tiene que obtener acceso a los datos XML sin procesar la sobrecarga del DOM. Por lo tanto, la XmlTextReader clase proporciona una forma más rápida de leer los datos XML. La XmlTextReader clase tiene diferentes constructors que especifican la ubicación de los datos XML.

    El siguiente código crea una instancia de la XmlTextReader clase y, a continuación, carga el archivo de Books.xml . Agregue el siguiente código a la _tmain función:

    XmlTextReader* reader = new XmlTextReader ("books.xml");
    

    Nota

    En Visual C++ 2005, la _tmain función se cambia a la función main.

  9. Leer los datos XML.

    Nota

    Este paso muestra un bucle While externo. En los dos pasos siguientes se muestra cómo usar el bucle While para leer los datos XML.

    Después de crear el XmlTextReader objeto, use el método Read para leer los datos XML.

    El método Read sigue desplazando secuencialmente por el archivo. XML hasta que el método Read alcanza el final del archivo. Cuando el método Read alcanza el final del archivo, el método Read devuelve false.

    while (reader->Read())
    {
        // Do some work here on the data.
        Console::WriteLine(reader->Name);
    }
    
  10. Examine los nodos.

    Para procesar los datos XML, cada registro tiene un tipo de nodo que se puede determinar a partir de la NodeType propiedad. La Name propiedad y la Value propiedad devuelven la siguiente información para el nodo actual o para el registro actual:

    • Nombre del nodo que es el nombre del elemento y el nombre del atributo.
    • Valor del nodo que es el texto del nodo.

    La NodeType enumeración determina el tipo de nodo. En el ejemplo de código siguiente se muestra el nombre de los elementos y el tipo de documento. El siguiente ejemplo de código omite los atributos de elemento:

    while (reader->Read())
    {
        switch (reader->NodeType)
        {
            case XmlNodeType::Element: // The node is an element.
                Console::Write("<{0}", reader->Name);
                Console::WriteLine(">");
                break;
            case XmlNodeType::Text: //Display the text in each element.
                Console::WriteLine (reader->Value);
                break;
            case XmlNodeType::EndElement: //Display the end of the element.
                Console::Write("</{0}", reader->Name);
                Console::WriteLine(">");
                break;
        }
    }
    
  11. Examine los atributos.

    Los tipos de nodo de elemento pueden incluir una lista de nodos de atributo que están asociados con los tipos de nodo de elemento. El MovetoNextAttribute método se desplaza secuencialmente por cada atributo del elemento. Use la HasAttributes propiedad para comprobar si el nodo tiene atributos. La AttributeCount propiedad devuelve el número de atributos del nodo actual.

    while (reader->Read())
    {
        switch (reader->NodeType)
        {
            case XmlNodeType::Element: // The node is an element.
                Console::Write("<{0}", reader->Name);
    
                while (reader->MoveToNextAttribute()) // Read the attributes.
                    Console::Write(" {0}='{1}'", reader->Name, reader->Value);
                Console::WriteLine(">");
                break;
            case XmlNodeType::Text: //Display the text in each element.
                Console::WriteLine (reader->Value);
                break;
            case XmlNodeType::EndElement: //Display the end of the element.
                Console::Write("</{0}", reader->Name);
                Console::WriteLine(">");
                break;
        }
    }
    
  12. Guarde la soluci? a. Compile la solución.

  13. Presione CTRL + F5 para ejecutar la aplicación de ejemplo.

Ver el listado de código completo en Visual Studio .NET 2002 o en Visual Studio .NET 2003

#include "stdafx.h"
#include <tchar.h>

#using <mscorlib.dll>
#using <System.xml.dll>

using namespace System;
using namespace System::Xml;

void _tmain(void)
{
    XmlTextReader* reader = new XmlTextReader ("books.xml");

    while (reader->Read())
    {
        switch (reader->NodeType)
        {
            case XmlNodeType::Element: // The node is an element.
                Console::Write("<{0}", reader->Name);
  
                while (reader->MoveToNextAttribute()) // Read the attributes.
                    Console::Write(" {0}='{1}'", reader->Name, reader->Value);
                Console::WriteLine(">");
                break;
            case XmlNodeType::Text: //Display the text in each element.
                Console::WriteLine (reader->Value);
                break;
            case XmlNodeType::EndElement: //Display the end of the element.
                Console::Write("</{0}", reader->Name);
                Console::WriteLine(">");
                break;
        }
    }
    Console::ReadLine();
}

Nota

Debe agregar la opción del compilador compatible con Common Language Runtime ( /clr:oldSyntax ) en Visual C++ 2005 para compilar correctamente el ejemplo de código anterior. Para agregar la opción de compilador compatible con Common Language Runtime en Visual C++ 2005, siga estos pasos:

  1. Haga clic en proyectoy, a continuación, en <ProjectName> propiedades.

    Nota

    <ProjectName> es un marcador de posición para el nombre del proyecto.

  2. Expanda propiedades de configuracióny, a continuación, haga clic en General.

  3. Haga clic para seleccionar compatibilidad con Common Language Runtime, sintaxis antigua (/CLR: oldSyntax) en el valor proyecto de Common Language Runtime support en el panel derecho, haga clic en aplicary, a continuación, haga clic en Aceptar.

    Para obtener más información sobre la opción del compilador compatible con Common Language Runtime, vea /CLR (compilación de Common Language Runtime).

Estos pasos se aplican a todo el artículo.

Ver el resultado de ejemplo

<bookstore>
    <book genre='autobiography' publicationdate='1981' ISBN='1-861003-11-0'>
        <title>
        The Autobiography of Benjamin Franklin
        </title>
        <author>
            <first-name>
            Benjamin
            </first-name>
            <last-name>
            Franklin
            </last-name>
        </author>
        <price>
        8.99
        </price>
    </book>
    <book genre='novel' publicationdate='1967' ISBN='0-201-63361-2'>
        <title>
        The Confidence Man
        </title>
        <author>
            <first-name>
            Herman
            </first-name>
            <last-name>
            Melville
            </last-name>
        </author>
        <price>
        11.99
        </price>
    </book>
    <book genre='philosophy' publicationdate='1991' ISBN='1-861001-57-6'>
        <title>
        The Gorgias
        </title>
        <author>
            <name>
            Plato
            </name>
        </author>
        <price>
        9.99
        </price>
    </book>
</bookstore>

Solución de problemas

Al ejecutar la aplicación de ejemplo, es posible que reciba el siguiente mensaje de error:

Excepción no controlada de tipo System.Xml.Xmlexcepción que se produjo en System.xml.dll información adicional: error del sistema.

Referencias

Para obtener más información acerca de la lectura de XML con XmlReader, vea lectura de XML con XmlReader.