Ler os dados XML de um arquivo usando o Visual C++

Este artigo mostra como usar a XmlTextReader classe para ler os dados XML de um arquivo.

Versão original do produto: Visual C++
Número de KB original: 815658

Resumo

Este artigo descreve como usar a XmlTextReader classe para ler os dados XML de um arquivo. A XmlTextReader classe fornece análise direta e tokenização dos dados XML. A XmlTextReader classe também implementa a especificação XML 1.0, além dos namespaces, na especificação XML definida pelo W3C (World Wide Web Consortium). Este artigo descreve como fazer acesso rápido e tokenizado de fluxo aos dados XML em vez de usar um modelo de objeto, como o DOM (Modelo de Objeto de Documento XML).

Para obter uma versão do .NET do Microsoft Visual C# deste artigo, consulte Como ler XML de um arquivo usando o Visual C#.

Este artigo refere-se ao seguinte namespace da Biblioteca de Classes do Microsoft .NET Framework: System.xml

Requisitos

Este artigo pressupõe que você esteja familiarizado com os seguintes tópicos:

  • Terminologia XML
  • Como criar e como ler um arquivo XML

A lista a seguir descreve o hardware, o software, a infraestrutura de rede e os service packs recomendados de que você precisa:

  • Microsoft Visual Studio .NET
  • Microsoft Visual Studio 2005

Ler os dados XML de um arquivo

O exemplo neste artigo usa um arquivo chamado Books.xml. Você pode criar seu próprio arquivo de Books.xml ou pode usar o arquivo de exemplo incluído nos Guias de Início Rápido do Microsoft .NET Software Development Kit (SDK). Você deve copiar o arquivo Books.xml para a pasta do projeto.

Para ler os dados XML de um arquivo, siga estas etapas:

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

  2. No menu Arquivo , aponte para Novo e clique em Projeto.

    A caixa de diálogo Novo Projeto aparece.

  3. Em Tipos de Projeto, clique em Projetos do Visual C++.

    Observação

    No Visual Studio 2005, os Projetos do Visual C++ são alterados para Visual C++.

  4. Em Modelos, clique em Aplicativo C++ Gerenciado se você estiver usando o Visual Studio .NET 2002.

    Em Modelos, clique em Aplicativo de Console (.NET) se você estiver usando o Visual Studio .NET 2003.

    Em Modelos, clique em Aplicativo de Console CLR se você estiver usando o Visual Studio 2005.

  5. Na caixa Nome , digite Q815658 e clique em OK.

  6. Adicione uma referência ao System.xml.dll no projeto. Para obter mais informações sobre como adicionar referências a um projeto gerenciado do Visual C++, consulte Adicionar referências a um projeto gerenciado do Visual C++

  7. Especifique a diretiva using no namespace System::Xml da seguinte maneira:

    using namespace System::Xml;
    

    Você faz isso para não precisar qualificar as XmlTextReader declarações de classe posteriormente em seu código. Você deve usar a diretiva using antes de qualquer outra declaração.

  8. Crie uma instância do XmlTextReader objeto. Preencha o XmlTextReader objeto com o arquivo .xml.

    Normalmente, a XmlTextReader classe será usada se você precisar acessar os dados XML brutos sem a sobrecarga do DOM. Portanto, a XmlTextReader classe fornece uma maneira mais rápida de ler os dados XML. A XmlTextReader classe possui elementos diferentes constructors que especificam o local dos dados XML.

    O código a seguir cria uma instância da XmlTextReader classe e carrega o arquivo Books.xml . Adicione o seguinte código à _tmain função:

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

    Observação

    No Visual C++ 2005, a _tmain função é alterada para a função principal.

  9. Leia os dados XML.

    Observação

    Esta etapa demonstra um loop externo while. As duas etapas que seguem esta etapa demonstram como usar o loop while para ler os dados XML.

    Depois de criar o XmlTextReader objeto, use o método Read para ler os dados XML.

    O método Read continua a se mover sequencialmente pelo arquivo .xml até que o método Read chegue ao final do arquivo. Quando o método Read atinge o final do arquivo, o método Read retorna false.

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

    Para processar os dados XML, cada registro tem um tipo de nó que pode ser determinado a partir da propriedade NodeType. A Name propriedade e a Value propriedade retornam as seguintes informações para o nó atual ou para o registro atual:

    • O nome do nó, que é composto pelo nome do elemento e o nome do atributo.
    • O valor do nó referente ao texto do nó.

    A NodeType enumeração determina o tipo de nó. O exemplo de código a seguir exibe o nome dos elementos e o tipo de documento. O exemplo de código a seguir ignora 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 os atributos.

    Os tipos de nó de elemento podem incluir uma lista de nós de atributos associados a eles. O MovetoNextAttribute método se move sequencialmente por cada atributo no elemento. Use a propriedade HasAttributes para testar se o nó tem algum atributo. A propriedade AttributeCount retorna o número de atributos para o nó atual.

    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. Salve a solução. Compile a solução.

  13. Pressione CTRL+F5 para executar o aplicativo de exemplo.

Exibir a listagem de código completa no Visual Studio .NET 2002 ou no 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();
}

Observação

Você deve adicionar a opção do compilador de suporte do Common Language Runtime (/clr:oldSyntax) no Visual C++ 2005 para compilar com êxito o exemplo de código anterior. Para adicionar a opção do compilador de suporte do Common Language Runtime no Visual C++ 2005, siga estas etapas:

  1. Clique em Projeto e, em seguida, clique <em Propriedades do ProjectName> .

    Observação

    <ProjectName> é um espaço reservado para o nome do projeto.

  2. Expanda propriedades de configuração e clique em Geral.

  3. Clique para selecionar Suporte do Common Language Runtime, Sintaxe Antiga (/clr:oldSyntax) na configuração de projeto de suporte do Common Language Runtime no painel direito, clique em Aplicar e clique em OK.

    Para obter mais informações sobre a opção do compilador de suporte do Common Language Runtime, consulte /clr (Common Language Runtime Compilation).

Essas etapas se aplicam a todo o artigo.

Exibir a saída de exemplo

<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>

Solução de problemas

Ao executar o aplicativo de exemplo, você pode receber a seguinte mensagem de erro:

Uma exceção sem tratamento do tipo System.Xml.XmlException ocorreu em System.xml.dll Informações adicionais: erro do sistema.

References

Para obter mais informações sobre como ler XML com o XmlReader, consulte Ler XML com o XmlReader.