C# - Lendo arquivos XML (revisitado)


 Neste artigo vou recordar como ler e acessar informações em arquivos XML usando a linguagem C#.

A XML é uma linguagem que descreve a si mesmo e fornece os dados, bem como as regras para extrair os dados que ele contém. A leitura ou Parsing de um arquivo XML significa ler as informações incorporadas em tags XML em um arquivo XML. Você pode analisar ou ler um documento XML de várias maneiras.

Vamos usar a classe XMLTextReader para ler um arquivo XML. Esta classe é uma classe abstrata que fornece o acesso rápido a arquivos XML.

Nota: Basicamente podemos ler um arquivo XML usando XmlTextReader, XmlDocument e Xpath;

Se pensarmos que um arquivo XML é um arquivo que pode variar muito de conteúdo, do mais simples ao mais complexo, vamos concluir que ler um arquivo XML pode ser uma tarefa simples ou complexa dependendo do arquivo XML que desejamos ler, de quais informações do arquivo desejamos obter e do que desejamos fazer com a informação extraída do arquivo.

Pensando nisso este artigo se propõe a uma tarefa bem modesta: ler o conteúdo de arquivos XML exibindo os valores dos elementos (somente o texto dos elementos e de seus atributos) usando uma aplicação Windows Forms.

A idéia básica é usar a classe XMLTextReader para ler e percorrer o arquivo XML e inspecionar cada nó do arquivo verificando qual o seu tipo para podermos decidir qual informação desejamos exibir.

Se pensarmos em um documento XML como uma hierarquia de nós podemos encontrar os seguintes tipos de nós e de seus nós filhos em um documento XML:

Tipo de Nó Descrição Nós Filhos possíveis
Document Representa o documento XML Element (max. one), ProcessingInstruction, Comment, DocumentType
DocumentFragment Representa um documento uma porção do documento. Element, ProcessingInstruction, Comment, Text, CDATASection, EntityReference
DocumentType Fornece uma interface para as entidades definidas para o documento. Nenhum
ProcessingInstruction Representa uma instrução de processamento. Nenhum
EntityReference Representa uma referencia de entidade Element, ProcessingInstruction, Comment, Text, CDATASection, EntityReference
Element Representa um elemento Element, Text, Comment, ProcessingInstruction, CDATASection, EntityReference
Attr Representa um atributo. Text, EntityReference
Text Representa um conteúdo textual em um elemento ou atributo. Nenhum
CDATASection Representa uma seção CDATA Nenhum
Comment Representa um comentário Nenhum
Entity Representa uma entidade Element, ProcessingInstruction, Comment, Text, CDATASection, EntityReference
Notation Representa uma notação declarada em um DTD Nenhum
Whitespace Espaço em branco entre a marcação. Nenhum
EndElement Nós EndElement são retornados ao final de um elemento. Nenhum
XmlDeclaration O nó XmlDeclaration deve ser o primeiro nó no documento.Ele não pode ter filhos.Ele é um filho do nó Document
Ele pode ter atributos que provém versão e a codificação de informações.
Nenhum
Notation Um nó de Notation não pode ter nenhum nó filho.Ele poderá aparecer como o filho do nó DocumentType Nenhum

Com base nisso uma das maneiras de obtermos informação de um arquivo XML é ler sequencialmente o arquivo e identifica qual o tipo de e Nó filho o elemento possui extraindo a informação desejada.

Para inspecionar os nós usamos a enumeração NodeType que determina qual o tipo de Nó podendo obter o nome do Nó (elementos/atributos) usando a propriedade Name e o seu valor através da propriedade Value.

Para inspecionar os atributos de um nó podemos usar a propriedade HasAttributes para verificar se o Nó tem algum atributo e o método MoveToNextAttribute para mover-se sequencialmente através de cada atributo do elemento.

No exemplo deste artigo veremos como usar a classe XmlReader para analisar uma seqüência de caracteres XML.

O arquivo XML usado como exemplo chama-se Produtos.xml e esta localizado na raiz do projeto:

Recursos Usados

Criando o projeto Windows Forms

Abra o VS 2015 Community e crie um novo projeto (File-> New Project) usando a linguagem C# e o template Windows Forms Application.

Informe um nome a seu gosto. Eu vou usar o nome Cshp_XML;

Selecione o formulário Form1.vb e partir da ToolBox inclua os seguintes controles:

  • 1 LisbBox - lbDados

  • 1 TextBox - Multiline = True, txtDados

  • 1 Button = btnLeXml

Disponha os controles conforme o leiaute da figura abaixo:

A seguir declare os seguintes namespaces no formulário:

using System;
using System.IO;
using System.Windows.Forms;
using System.Xml;

No inicío do formulário vamos declarar a variável caminhoArquivo que iremos usar para obter o caminho do arquivo na raíz do projeto.

 private string caminhoArquivo = Path.GetDirectoryName(System.AppDomain.CurrentDomain.BaseDirectory);

Agorano evento Click do botão de comando - Ler XML - inclua o código abaixo:

        private void btnLeXml_Click(object sender, EventArgs e)
        {
            //monta o caminho do arquivo na raiz do projeto
            caminhoArquivo = Directory.GetParent(Directory.GetParent(caminhoArquivo).FullName).FullName;
            caminhoArquivo += @"\produtos.xml";
            XmlTextReader xmlReader = new XmlTextReader(caminhoArquivo);
            while (xmlReader.Read())
            {
                switch (xmlReader.NodeType)
                {
                    case XmlNodeType.Element:
                        lbDados.Items.Add("<" + xmlReader.Name + ">");
                        txtDados.Text += "<" + xmlReader.Name + ">" + Environment.NewLine;
                        break;
                    case XmlNodeType.Text:
                        lbDados.Items.Add(xmlReader.Value);
                        txtDados.Text += xmlReader.Value+ Environment.NewLine;
                        break;
                    case XmlNodeType.EndElement:
                        lbDados.Items.Add("<" + xmlReader.Name + ">");
                        txtDados.Text += "<" + xmlReader.Name + ">" + Environment.NewLine;
                        break;
                }
            }
    }

Neste código usamos uma instância da classe XmlTextReader para ler o arquivo XML Produtos.xml na raiz do projeto. A leitura do arquivo é feita usando o método Read.

A seguir verificamos o tipo de Nó existente no arquivo e obtemos o valor do respectivo nó usando a propriedade Name e Value.

Estamos exibindo o resultado em um ListBox e em um TextBox.(No TextBox usamos a propriedade Environment.NewLine para incluir um caractere de nova linha)

Executando o projeto iremos obter o seguinte resultado:

Pegue o projeto completo aqui :  Cshp_Xml.zip

Todas as coisas são puras para os puros, mas nada é puro para os contaminados e infiéis; antes o seu entendimento e consciência estão contaminados.
Confessam que conhecem a Deus, mas negam-no com as obras, sendo abomináveis, e desobedientes, e reprovados para toda a boa obra.
Tito 1:15,16

  Gostou ?   Compartilhe no Facebook   Compartilhe no Twitter

 

Referências:


José Carlos Macoratti