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 original del producto: 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 tokenización 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 World Wide Web Consortium (W3C). En este artículo se describe cómo realizar un acceso rápido y con token a los datos XML en lugar de usar un modelo de objetos, como el modelo de objetos de documento XML (DOM).

Para obtener una versión de .NET de Microsoft Visual C# de este artículo, vea How to read XML from a file by using Visual C# (Cómo leer XML de un archivo mediante Visual C#).

En este artículo se hace referencia al siguiente espacio de nombres biblioteca de clases de Microsoft .NET Framework: System.xml

Requisitos

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

  • Terminología XML
  • Creación y lectura de un archivo XML

En la lista siguiente 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 denominado Books.xml. Puede crear su propio archivo Books.xml, o bien puede usar el archivo de ejemplo que se incluye con los inicios rápidos del Kit de desarrollo de software (SDK) de Microsoft .NET. Debe copiar el archivo 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, Proyectos de Visual C++ se cambia a Visual C++.

  4. En Plantillas, haga clic en Aplicación de C++ administrada si usa Visual Studio .NET 2002.

    En Plantillas, haga clic en Aplicación de consola (.NET) si usa 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 Q815658 y, a continuación, haga clic en Aceptar.

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

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

    using namespace System::Xml;
    

    Haga esto para que no tenga que 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 acceder a los datos XML sin procesar sin la sobrecarga del DOM. Por lo tanto, la XmlTextReader clase proporciona una manera 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 código siguiente crea una instancia de la XmlTextReader clase y, a continuación, carga el archivo Books.xml . Agregue el código siguiente 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 principal.

  9. Lea los datos XML.

    Nota:

    En este paso se muestra un bucle while externo. Los dos pasos que siguen a este paso muestran 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 continúa movándose secuencialmente a través del archivo .xml hasta que el método Read llega al final del archivo. Cuando el método Read llega al 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. En el ejemplo de código siguiente se omiten 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 asociados a los tipos de nodo de elemento. El MovetoNextAttribute método se mueve secuencialmente a través de cada atributo del elemento. Use la HasAttributes propiedad para probar 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ón. Compile la solución.

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

Visualización de la lista de código completa 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 de compatibilidad con Common Language Runtime (/clr:oldSyntax) en Visual C++ 2005 para compilar correctamente el ejemplo de código anterior. Para agregar la opción del compilador de compatibilidad con Common Language Runtime en Visual C++ 2005, siga estos pasos:

  1. Haga clic en Proyectoy, a continuación, haga clic en <Propiedades de> NombreDeProyecto.

    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 la configuración del proyecto de soporte técnico de Common Language Runtime 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 de compatibilidad con Common Language Runtime, vea /clr (Compilación de Common Language Runtime).

Estos pasos se aplican a todo el artículo.

Visualización de la salida 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, puede recibir el siguiente mensaje de error:

Excepción no controlada del tipo System.Xml. XmlException se produjo en System.xml.dll Información adicional: Error del sistema.

Referencias

Para obtener más información sobre cómo leer XML con XmlReader, vea Lectura de XML con XmlReader.