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


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

Estamos continuando a primeira parte do artigo e até agora, houve um foco apenas na busca baseada em elementos.

Há mais que pode ser pesquisado em apenas elementos. Por exemplo, digamos que alguém nos pede para encontrar todos os livros e filmes que possuem o atributo verificado igual a 'n'.

É uma tarefa fácil basta usar SelectNodes com XPath.

using System;
using System.Xml;
namespace CShp_XML
{
    class Program
    {
        static void Main(string[] args)
        {
            XmlDocument document = new XmlDocument();
            document.Load("..\\Acervo.xml");
            XmlNodeList resultado = 
                document.SelectNodes("acervo/livros/livro[@verificado ='n'] | acervo/filmes/filme[@verificado ='n']");
            foreach (XmlNode item in resultado)
            {
                Console.WriteLine(item.OuterXml + Environment.NewLine);
            }
           Console.ReadKey();
        }
    }
}

O resultado deste código é visto abaixo:

O código acima usa a notação de atributo para localizar filmes e livros que com o atributo verificado igual a 'n'. Para procurar por ambos, é necessário adicionar um pipe ( | ) entre as duas consultas XPath.

Considere isso como uma instrução OR equivalente a || no C#. Esta notação é útil quando há muitos filhos diferentes do elemento raiz e você deseja filtrar para baixo. Se tivéssemos CDs neste acervo, poderíamos usar o código acima para encontrar livros e filmes e ignorar os CDs.

O problema com o código acima é que ele é muito detalhado, especialmente se houver muitos filhos do nó em que você está pesquisando. Existe uma maneira mais fácil de encontrar essa informação sem ter que digitar todas as possibilidades que é usar a o operador estrela(*) e a pesquisa recursiva no XPath.

    class Program
    {
        static void Main(string[] args)
        {
            XmlDocument document = new XmlDocument();
            document.Load("..\\Acervo.xml");

            XmlNodeList resultado = document.SelectNodes("acervo//*[@verificado='n']");

            foreach (XmlNode item in resultado)
            {
                Console.WriteLine(item.OuterXml + Environment.NewLine);
            }
            Console.ReadKey();
        }
    }

O código acima contém dois atalhos diferentes.:

1- Primeiro, há a barra dupla (//)

Esta é uma maneira de obter todos os nós filhos recursivamente.

Para este arquivo XML, isso significa que vamos pesquisar não apenas para os elementos de livros e filmes, mas também para os filhos desses nós.

Isso nos dá acesso a todos os elementos sob o nó acervo. Tenha cuidado ao usar a barra dupla em suas consultas XPath, pois ele selecionará todos os elementos, independentemente do tipo de
elemento. Se algum outro elemento fosse adicionado ao elemento do acervo, esses elementos seriam incluídos nos resultados também.

2- O segundo atalho é a estrela (*)

A estrela(*) é um atalho que ignora o tipo de elemento. O que isso significa é que trata um elemento do livro da mesma forma como o elemento do filme.

Ela é extremamente útil quando você tem vários filhos diferentes ou netos sob um único elemento e deseja pesquisar todos eles. Nós não temos que usar o operador | para combinar várias consultas, o que reduz drasticamente o quantidade de código necessário.

Estamos usando atributos para realizar a pesquisa mas podemos também pesquisar quais atributos estão em um elemento usando a propriedade Attributes que vai retornar um XmlAttributeCollection que pode ser iterado.

Vejamos um exemplo usando esse recurso onde vamos exibir apenas os atributos 's' ou 'n' de cada elemento 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("//livro");

            foreach (XmlNode livro in livros)
            {
                var atributos = livro.Attributes;
               foreach (XmlAttribute attr in atributos)
               {
                    Console.WriteLine(attr.Value + Environment.NewLine);
               }
            }
            Console.ReadKey();
        }
    }
}

Neste código existe uma iteração padrão que foi vista ao lidar com XmlNodes, mas, infelizmente, há uma diferença: o uso de Value.

O recurso Attributes não tem valores InnerText ou InnerXml. Ao tentar obter o texto de um atributo, voce vai perceber que não é exibido o valor do atributo.

Ao usar o atributo Value o único texto que será exibido é o texto que está cercado pelas aspas para esse atributo e que é mostrado na figura ao lado como resultado da execução do código.

Em outro artigo veremos como usar XPathDocument  para realizar consultas em um documento XML.

"Porque Cristo não entrou num santuário feito por mãos, figura do verdadeiro, porém no mesmo céu, para agora comparecer por nós perante a face de Deus;"
Hebreus 9:24

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