ASP .NET - Filtrando e exibindo dados XML com LINQ


Neste artigo vamos ver como exibir e filtrar informações de uma fonte de dados XML usando LINQ em páginas ASP .NET.

O LINQ to XML é um provedor de dados LINQ que é implementado no namespace System.Xml.LINQ a partir da versão 3.5 da plataforma .NET. Ele fornece um modelo de programação que permite ler, construir e escrever dados XML.

Você pode usar LINQ To XML para realizar consultas LINQ sobre dados no formato XML que podem ser retornados do arquivo de sistemas, de uma URL HTTP remota, de um web service ou partir de qualquer XML em memória existente.

O objetivo será acessar uma fonte de dados XML exibindo o seu conteúdo em uma página ASP .NET e filtrar informações com base em um critério usando LINQ to XML.

Abaixo temos a tela de apresentação inicial da aplicação e ao lado o filtro aplicado usando como critério a cidade selecionada no controle dropdownlist.

Eu vou usar o Visual Web Developer 2008 Express Edition (VWD 2008) no exemplo deste artigo.

Vamos abrir o VWD 2008 e no menu File selecionar New Web Site selecionando o template ASP .NET Web Site, a linguagem C# , informar o nome LINQ_xml e clicar no botão OK;

Com o web site criado vamos definir uma fonte de dados XML no projeto. Primeiro devemos criar a pasta App_Data clicando com o botão direito do mouse sobre o nome do projeto e selecionando add ASP .NET Folder -> App_Data;

A seguir clique com o botão direito sobre a pasta App_Data e selecione Add New Item;

A seguir selecione o template XML File, informe o nome Clientes.xml e clique no botão Add;

A seguir no editor XML que será aberto, defina a estrutura do arquivo XML conforme abaixo:

<?xml version="1.0" encoding="utf-8" ?>
<Clientes>
    <Cliente>
        <Nome>Macoratti</Nome>
        <Cidade>Brasilia</Cidade>
        <Idade>37</Idade>
    </Cliente>
    <Cliente>
        <Nome>Jessica</Nome>
        <Cidade>Santos</Cidade>
        <Idade>19</Idade>
    </Cliente>
    <Cliente>
        <Nome>Jefferson</Nome>
        <Cidade>Marilia</Cidade>
        <Idade>17</Idade>
    </Cliente>
    <Cliente>
        <Nome>Janice</Nome>
        <Cidade>Campinas</Cidade>
        <Idade>13</Idade>
    </Cliente>
</Clientes>

Agora vamos criar a interface com o usuário usando o formulário Default.aspx.

Selecione a página Default.aspx e no modo de Design a partir do menu Table -> Insert Table inclua uma tabela com 4 linhas e duas colunas e inclua os seguintes componentes :

O leiaute do formulário web pode ser visto abaixo:

Vamos definir o código no arquivo Default.aspx.cs (code-behind).

A primeira coisa a fazer é declarar os namespaces para acessar os recursos do XML e do LINQ:

using System.Xml.Linq;
using System.Xml;

No evento Load da página vamos verificar se ocorre um postback e chamar a rotina carregaDLL para preencher o controle dropdownlist;

 protected void Page_Load(object sender, EventArgs e)
    {
        if (!IsPostBack)
            carregaDLL();
    }

O código da rotina carregaDLL() é dado a seguir. Estamos instanciando um XmlDocument e usando o seu método Load para carregar o arquivo XML

 protected void carregaDLL()
    {
        XmlDocument doc = new XmlDocument();
        doc.Load(Server.MapPath("App_Data/Clientes.xml"));
        XmlNodeList nodeList = doc.SelectNodes("Clientes/Cliente");

        foreach (XmlNode node in nodeList)
            ddlCidade.Items.Add(new ListItem(node.SelectSingleNode("Cidade").InnerText));
    }

Agora no evento Click do botão Filtrar XML temos o seguinte código:

 protected void butFiltraXML_Click(object sender, EventArgs e)
    {
        XDocument xmlDoc = XDocument.Load(Server.MapPath("App_Data/Clientes.xml"));

        var clientes = from cliente in xmlDoc.Descendants("Cliente")
                              where cliente.Element("Cidade").Value == ddlCidade.SelectedItem.ToString()
                             select new
                             {
                                Nome = cliente.Element("Nome").Value,
                                Cidade = cliente.Element("Cidade").Value,
                                Idade = cliente.Element("Idade").Value,
                             };

        litXMLDados.Text = "";
        foreach (var cliente in clientes)
        {
            litXMLDados.Text = litXMLDados.Text + "Nome  : " + cliente.Nome + "<br />";
            litXMLDados.Text = litXMLDados.Text + "Cidade: " + cliente.Cidade + "<br />";
            litXMLDados.Text = litXMLDados.Text + "Idade : " + cliente.Idade + "<br /><br />";
        }

        if (litXMLDados.Text == "")
            litXMLDados.Text = "Nada encontrado.";
    }

Neste código estamos usando uma consulta LINQ para filtrar as informações do arquivo Clientes.xml. Observe que estamos usando o item selecionado do controle DropDownList para filtrar as informações por cidade selecionada;

A seguir temos o código do evento Click do botão - Exibir XML - que obtêm as informações do arquivo xml e as exibe;

 protected void butGetXML_Click(object sender, EventArgs e)
    {
        XDocument xmlDoc = XDocument.Load(Server.MapPath("App_Data/Clientes.xml"));

        var clientes = from cliente in xmlDoc.Descendants("Cliente")
                             select new
                             {
                                   Nome =  cliente.Element("Nome").Value,
                                   Cidade = cliente.Element("Cidade").Value,
                                   Idade = cliente.Element("Idade").Value,
                             };

        litXMLDados.Text = "";
        foreach (var cliente in clientes)
        {
            litXMLDados.Text = litXMLDados.Text + "Nome  : " + cliente.Nome + "<br />";
            litXMLDados.Text = litXMLDados.Text + "Cidade: " + cliente.Cidade + "<br />";
            litXMLDados.Text = litXMLDados.Text + "Idade : " + cliente.Idade + "<br /><br />";
        }

        if (litXMLDados.Text == "")
            litXMLDados.Text = "Nada encontrado.";
    }

Aqui novamente usamos uma consulta LINQ para selecionar informações do arquivo Clientes.xml;

Note que o código é bem simples, principalmente usando os recursos do LINQ to XML.

Pegue o projeto completo aqui: LINQ_xml.zip

Eu sei é apenas LINQ to XML mas eu gosto...

Referências:


José Carlos Macoratti