Lendo XML com LINQ

Olá pessoal tudo bem ?

Todos sabemos o poder da LINQ, nesse post vamos aprender como carregar e ler o XML a partir de uma URL.

Para esse exemplo vamos criar um projeto  do tipo “Console Application” segue abaixo a estrutura do projeto, lembrando que todos os projetos apresentados sempre adiciono no GIT.

 

Antes de escrevermos algum código vamos observar o Designer de Class abaixo.

Para esse projeto resolvi desenvolver essa estrutura, uma interface que recebe outra class por parâmetro possibilitando devolver uma lista de acordo com a necessidade de cada arquivo gerado.

Criei também uma class PessoaXML que implementara os métodos da Interface , podemos notar que nessa class temos os atributos nome,email,senha os mesmos atributos que temos no XML que podemos consultar na  url http://juliano-sales.net/Exemplos/Usuarios.xml

Vamos Implementar a interface Arquivo segue abaixo o código da interface.

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace LeitorXML
{
    public interface IArquivo<T>
    {
        object CarregarArquivo(string urlArquivo);
        List<T>ListaArquivo(object arquivo);
    }
}

 

Agora precisamos criar nossa class PessoaXML segue abaixo o código da implementação dos métodos da interface.

Note que no exemplo abaixo o  método CarregarArquivo devolve um objeto do tipo XElement

 
public object CarregarArquivo(string urlArquivo)
        {
            XElement xmlDocumento = XElement.Load(urlArquivo);
            return xmlDocumento;
        }

 

Agora vamos analisar o código que  retorna uma lista de Arquivo.

No método ListaArquivo estamos recebendo um parâmetro do tipo object note que criamos uma variável xmlDocumento do tipo XElement que está recebendo o nosso parâmetro através de um CAST.

public List<PessoaXML> ListaArquivo(object arquivo)
        {
            XElement xmlDocumento = (XElement)arquivo;

            var dadosXMl = (from xml in xmlDocumento.Descendants("Usuario")
                            select new PessoaXML
                            {
                                nome = xml.Element("nome").Value,
                                email = xml.Element("email").Value,
                                senha = xml.Element("senha").Value
                            }).ToList();

            return dadosXMl;
        }

 

Uma vez nossa variável carregada com o XML vamos utilizar a LINQ para percorrer a nossa variável xmlDocumento.

Na linha abaixo estou usando o .Descendants e passo para ele o elemento filho ou seja  o elemento “Usuario” .

from xml in xmlDocumento.Descendants("Usuario")

Uma vez preenchido o nosso objeto xml podemos acessar os elementos e assim obter os seus valores.

 nome = xml.Element("nome").Value,
 email = xml.Element("email").Value,
 senha = xml.Element("senha").Value

Agora vamos executar os teste da nossa class PessoaXML.

using System;
using Microsoft.VisualStudio.TestTools.UnitTesting;
using LeitorXML;

namespace UnitTestLeitoXML
{
    [TestClass]
    public class PessoaXMLTest
    {

        [TestMethod]
        public void deve_retornar_a_quantidade_8_de_registro_do_xml()
        {
            IArquivo arquivo = new PessoaXML();

            var xmlDocumento = arquivo.CarregarArquivo("http://juliano-sales.net/Exemplos/Usuarios.xml");
            var listaArquivo = arquivo.ListaArquivo(xmlDocumento);

            Assert.AreEqual(8, listaArquivo.Count);
        }
    }
}

 

Abaixo temos o resultado final.

 

LEAVE A COMMENT