XML - Acessando e Lendo arquivos XML (revisitado) - I


 Neste artigo eu vou recordar como podemos acessar, ler e consultar informações em um arquivo XML usando a linguagem C#.

Acessar e ler um arquivo XML é a base do tratamento do XML em qualquer aplicativo. Se sua aplicação é incapaz de ler XML, então você não poderá fazer muita coisa com o seu XML.

Existem várias maneiras de acessar, ler e consultar XML, e neste artigo vamos dar uma visão sobre quais métodos temos disponíveis na linguagem C#.

Nos exemplos do artigo estarei usando o VS 2017 Community em uma aplicação console para focar apenas no código usado para acessar o XML.

O arquivo Acervo.xml usado como exemplo esta na pasta bin/debug da aplicação e possui o seguinte conteúdo :

<?xml version="1.0" encoding="utf-8" ?>
<acervo>
  <livros>
    <livro verificado="n">
      <titulo>Sidarta</titulo>
      <autor>Herman Hesse</autor>
    </livro>
    <livro verificado="n">
      <titulo>Crime e Castrigo</titulo>
      <autor>Fiodor Dostoievski</autor>
    </livro>
    <livro verificado="s">
      <titulo>O grande Gatsby</titulo>
      <autor>Scott Fitzgerald</autor>
    </livro>
    <livro verificado="n">
      <titulo>1984</titulo>
      <autor>George Orwell</autor>
    </livro>
  </livros>
  <filmes>
    <filme verificado="n">
      <titulo>King Kong</titulo>
      <ano>1933</ano>
    </filme>
    <filme verificado="s">
      <titulo>2001 - Uma odisseia no espaco</titulo>
      <ano>1968</ano>
    </filme>
    <filme verificado="s">
      <titulo>Forrest Gump</titulo>
      <ano>1994</ano>
    </filme>
    <filme verificado="n">
      <titulo>O poderoso chefao</titulo>
      <ano>1972</ano>
    </filme>
  </filmes>
</acervo>

Usando a classe XmlDocument

A classe XmlDocument foi a primeira maneira de lidar com a leitura e gravação de XML na plataforma .NET com a linguagem C#, e, está incluída no namespace System.Xml. Usando esta classe você pode ler XML e também manipular e escrever XML.

Para poder fazer qualquer coisa com dados XML primeiro precisamos carregar o XML em uma instância de XmlDocument, e, existem duas maneiras de fazer isso:  carregando os dados a partir de um arquivo ou a partir de uma string.

1- carregando XML a partir de um arquivo

XmlDocument document = new XmlDocument();
document.Load("..\\Acervo.xml");

2- Carregando XML a partir de uma string

XmlDocument document = new XmlDocument();
string xml = "<livro genero='novela' ISBN='1-861001-57-5'>" +
                    "<titulo>Orgulho e Preconceito</titulo>" +
                    "</livro>"
document.LoadXml(xml);

Uma vez que o arquivo foi carregado podemos iniciar a leitura do seu conteúdo que pode ser feita de diversas formas.

Aqui entra o XPath que é uma sintaxe usada para definir partes do documento XML e que pode ser usado para navegar através de elementos e atributos do documento XML.

Podemos usar XPath para recuperar um único Nó(Node) ou uma coleção de Nós do documento XML e para poder recuperar vários nós podemos usar o método SelectNodes.

No exemplo do nosso arquivo XML Acervo.xml podemos usar SelectNodes para recuperar todos os livros e usar uma consulta XPath que vai iniciar no nível superior, onde existe o nó Acervo. A partir daí, o nó filho livros contém todos os livros que estão no acervo, o que significa que o nó livros será anexado ao XPath para nos fornecer acervo/livros.

Esse XPath irá recuperar o nó dos livros, incluindo todos os filhos, e , como queremos obter um livro vamos anexar este nó na consulta XPath o que nos dá o resultado final da consulta como : acervo/livros/livro.

using System;
using System.Xml;
namespace CShp_XML
{
    class Program
    {
        static void Main(string[] args)
        {
            XmlDocument document = new XmlDocument();
            document.Load("..\\Acervo.xml");
            XmlNodeList livros = document.SelectNodes("acervo/livros/livro");

            Console.WriteLine("Livros");
            foreach (XmlNode livro in livros)
            {
                Console.WriteLine("\t" + livro.OuterXml);
            }
            Console.WriteLine("Filmes");
            XmlNodeList filmes = document.SelectNodes("acervo/filmes/filme");
            foreach (XmlNode filme in filmes)
            {
                string titulo = filme["titulo"].InnerText;
                string ano = filme["ano"].InnerText;
                Console.WriteLine($"\tTitulo : {titulo} Ano : {ano}");
            }
            Console.ReadKey();
        }
    }
}

O código acima cria uma instância do XmlDocument e carrega o arquivo acervo.xml na instância XmlDocument. Depois que o XML é carregado no documento, SelectNodes é usado pois estamos procurando por vários nós de livros em vez de um específico.

Se houvesse apenas um nó de livro no documento, ele retornaria o único elemento no XmlNodeList que representa uma coleção ordenada de nós. A propriedade OuterXml é usada para obter o XML do nó atual. Existem outras propriedades que obtêm vários elementos XML de um XmlNode, que veremos mais adiante no artigo.

No código para acessar os filmes estou usando uma abordagem onde percorremos os filmes e usamos a propriedade InnerText para retornar o valor do atributo do elemento.

O que produz o seguinte resultado na execução:



Para procurar por apenas um único elemento, podemos usar o método SelectSingleNode que usa uma expressão XPath e retorna um único XmlNode.

Esse método sempre retornará um único nó, contanto que um nó seja retornado, não importa qual seja a consulta. Se tivermos o código abaixo executado usando o nosso arquivo acervo.xml :

using System;
using System.Xml;
namespace CShp_XML
{
    class Program
    {
        static void Main(string[] args)
        {
            XmlDocument document = new XmlDocument();
            document.Load("..\\Acervo.xml");
            XmlNode livro = document.SelectSingleNode("//livro");
            Console.WriteLine("Livro");
            Console.WriteLine("\t" + livro.OuterXml);
            Console.WriteLine("Filme");
            XmlNode filme = document.SelectSingleNode("//filme");
            string titulo = filme["titulo"].InnerText;
            string ano = filme["ano"].InnerText;
            Console.WriteLine($"\tTitulo : {titulo} Ano : {ano}");
            Console.ReadKey();
        }
    }
}

Obteremos um único livro conforme abaixo:

Observe que é retornado o primeiro livro que esta sob o elemento livros. Assim SelectSingleNode irá pegar qualquer elemento que seja o primeiro e retornar na expressão XPath.

É claro que existem outras maneira de obter um nó específico usando uma consulta como a seguir:

XmlNode livro = document.SelectSingleNode ("/acervo/livros/livro [titulo ='Sidarta']");

A consulta retornará o mesmo elemento de livro que vimos acima, mas neste exemplo ele está usando um filtro para encontrar o livro que tem o título Sidarta.

Na próxima parte do artigo veremos como usar atributos para realizar consultas em um documento XML.

Pegue o projeto aqui :  CShp_XML_1.zip

"Sabendo que, se o nosso coração nos condena, maior é Deus do que o nosso coração, e conhece todas as coisas."
1 João 3:20

Veja os Destaques e novidades do SUPER DVD Visual Basic (sempre atualizado) : clique e confira  

Quer migrar para o VB .NET ?

Quer aprender C# ??

Quer aprender os conceitos da Programação Orientada a objetos ?

Quer aprender o gerar relatórios com o ReportViewer no VS 2013 ?

  Gostou ?   Compartilhe no Facebook   Compartilhe no Twitter
 

Referências:


José Carlos Macoratti