domingo, 12 de julho de 2015

ASP.Net – Utilizando XML




Todos nós desenvolvedores sabemos da importância do XML (Extensible Markup Language) em nossas vidas. É importante lembrar que este tipo de arquivo é capaz de descrever diversos tipos de dados, seu propósito é a troca de informações entre sistemas através da internet. A característica básica do XML é de criar uma “infraestrutura” (um padrão) único para diversas linguagens. A intenção deste artigo é de alimentar um XML com os principais comandos: Inclusão, Alteração, Exclusão e Pesquisa totalmente independente de Banco de Dados. Para esta tarefa utilizaremos algumas classes relacionadas a este assunto, tais como: a “XMLDocument”, “XMLElement”, “XMLNodeList” e “XMLNode” nos fornecendo todos os métodos e propriedades necessárias.

Classe XMLDocument

Os denominados DOM (Document Object Model) é uma representação em memória de árvore (em cache) de um documento XML e permitem a navegação e a edição deste documento. É importante salientar que o XmlDocument implementa a interface de IXPathNavigable podendo também ser usada como o documento de origem para a classe de “XslTransform.
A classe de “XmlDataDocument estende XmlDocument e permite que os dados são estruturados, armazenados, recuperados, e manipulados por um DataSet relacional.

Propriedades e Métodos:

- Load(): Este método possui diversos tipos de escrita, o que utilizaremos é o que tem como parâmetro uma String, responsável por carregar o documento XML pelo caminho especificado.

- CreateElement(): Tem como parâmetro uma string para criar um elemento com o nome especificado.

- InnerText: O nome do XMLElement Criado.

- DocumentElement(): Método para obter a raiz (XMLElement) para o documento em questão.

- Save(): Este método também possui inúmeros tipos de escrita, teremos como parâmetro uma Sring, a qual irá salvar o documento especificado pelo caminho(path).


Classe XMLElement

Esta classe possui os elementos, os quais iremos manipulá-los e que podem ter atributos associados a eles. A classe “XmlElement” têm vários métodos para acessar atributos como por exemplo: “GetAttribute, “SetAttribute, “RemoveAttribute, “GetAttributeNode (não citaremos neste artigo). O principal papel desta classe é atribuir elementos XML para o objeto e o seu principal método é o “AppendChild()”, que será abordado logo abaixo.

Métodos:

- AppendChild(): Adiciona o nó especificado para o final da lista de nós filhos. Possui como parâmetro o objeto do tipo XMLElement.

Classe XmlNodeList

Em poucas palavras, esta classe representa uma coleção ordenada de nós. Ela oferece suporte a iteração e acesso indexado. Não podemos deixar de informar a existência de alguns métodos como: - SelectNodes (Retorna um XmlNodeList que contém uma coleção de nós que correspondem a consulta Xpath) e  
GetElementsByTagName(Retorna um XmlNodeList contendo uma lista de todos os elementos descendentes que corresponde ao nome especificado)

Métodos:

- ChildNodes: Retorna um XmlNodeList que contém todos os filhos do nó.
- Item: Recupera um nó índice fornecido.

Classe XMLNode

Essa classe é a base na implementação do .NET DOM. Suporta seleções XPath e fornece recursos de edição. A classe de XmlDocument estende XmlNode e representa um documento XML. Atribuímos o nó que desejarmos através do objeto desta classe.

Métodos:

- ParentNode: Obtém o pai do nó (para os nós que podem ter pais).
-
RemoveChild: Método para remover o nó filho.

Criando o Exemplo

Inicie o Microsoft Visual Studio e em File/New/Project... escolhendo “Asp.Net Empty Web Application” para criarmos uma aplicação web em branco, definindo o nome que desejar. Devemos também adicionar no projeto um item do tipo XML(Botão direito “Add New Item” escolhendo “XML File”). Teremos a estrutura dos arquivos conforme demonstra a Imagem 01.
Figura 01: Estrutura de Arquivos no Solution Explorer.

No meu caso defini o nome do XML como “theclub.xml” e por padrão a estrutura deste tipo de arquivo deverá estar identica ao código abaixo: (É importante adicionar uma tag padrão)

<?xml version="1.0" encoding="utf-8"?>
<theclub>
</theclub>
Listagem 01: Arquivo theclub.xml.

Dentro da Tag “theclub” é onde salvaremos os dados conforme o tipo de campo que usaremos ao decorrer do desenvolvimento do artigo.

Na Figura 02 foram adicionados alguns TextBoxs e seus respectivos Labels, como: Nome, Cidade e Observação. Foram adicionados um botão para cada operação, sendo: Incluir, Alterar, Excluir e Limpar. Não podemos esquecer de adicionar o Gridview.
 
Figura 02: Exemplo de WebForm para Manipulação de dados.

Aproveito também para demonstrar o trecho do código em Aspx correspondente ao WebForm, confiram na Listagem 02.

<%@ Page Language="C#" AutoEventWireup="true"  CodeFile="Default.aspx.cs" Inherits="_Default" %>

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
    <title>Tratando arquivos XML</title>
    <style type="text/css">
        .style1
        {
            width: 65%;
        }
        .style4
        {
            font-family: "Trebuchet MS";
            font-size: small;
            width: 55px;
        }
        .style5
        {
            width: 55px;
        }
    </style>
</head>
<body>
    <form id="form1" runat="server">
    <div>
   
        <table class="style1">
            <tr>
                <td class="style4">
                    <asp:Label ID="lblNome" runat="server" Text="Nome:"></asp:Label>
                </td>
                <td>
                    <asp:TextBox ID="txtNome" runat="server"></asp:TextBox>
                </td>
            </tr>
            <tr>
                <td class="style4">
                    <asp:Label ID="lblCidade" runat="server" Text="Cidade:"></asp:Label>
                </td>
                <td>
                    <asp:TextBox ID="txtCidade" runat="server"></asp:TextBox>
                </td>
            </tr>
            <tr>
                <td class="style4">
                    <asp:Label ID="lblObservacao" runat="server" Text="Observação:"></asp:Label>
                </td>
                <td>
                    <asp:TextBox ID="txtObservacao" runat="server" BackColor="#FFFFE6"
                        ForeColor="#0033CC" Height="120px" TextMode="MultiLine" Width="398px"></asp:TextBox>
                </td>
            </tr>
            <tr>
                <td class="style5">
                    &nbsp;</td>
                <td>
                    <asp:Button ID="btnIncluir" runat="server" onclick="btnIncluir_Click"
                        Text="Incluir" />
                &nbsp;<asp:Button ID="btnAlterar" runat="server" Text="Alterar"
                        onclick="btnAlterar_Click" />
                &nbsp;<asp:Button ID="btnExcluir" runat="server" Text="Excluir"
                        onclick="btnExcluir_Click" />
                &nbsp;<asp:Button ID="btnLimpar" runat="server" Text="Limpar"
                        onclick="btnLimpar_Click" />
                </td>
            </tr>
            <tr>
                <td colspan="2">
                <asp:GridView ID="GridDados" runat="server" CellPadding="3" GridLines="Horizontal"
                        OnSelectedIndexChanged="GridView1_SelectedIndexChanged" Width="629px"
                        AutoGenerateColumns="False" BackColor="White" BorderColor="#E7E7FF"
                        BorderStyle="None" BorderWidth="1px" Font-Names="Trebuchet MS"
                        Font-Size="Small" Height="160px" AllowPaging="True"
                        PageSize="4" onpageindexchanging="GridView1_PageIndexChanging">
                    <FooterStyle BackColor="#B5C7DE" ForeColor="#4A3C8C" />
                    <Columns>
                        <asp:CommandField CancelText="Cancelar" DeleteText="Excluir" EditText="Alterar"
                            InsertText="Incluir" NewText="Novo" SelectText="Selecionar"
                            ShowSelectButton="True" UpdateText="Atualizar" />
                        <asp:BoundField DataField="nome" HeaderText="Nome" />
                        <asp:BoundField DataField="cidade" HeaderText="Cidade" />
                        <asp:BoundField DataField="observacao" HeaderText="Observação" />
                    </Columns>
                    <RowStyle BackColor="#E7E7FF" ForeColor="#4A3C8C" />
                    <SelectedRowStyle BackColor="#738A9C" Font-Bold="True" ForeColor="#F7F7F7" />
                    <PagerStyle BackColor="#E7E7FF" ForeColor="#4A3C8C" HorizontalAlign="Right" />
                    <HeaderStyle BackColor="#4A3C8C" Font-Bold="True" ForeColor="#F7F7F7" />
                    <AlternatingRowStyle BackColor="#F7F7F7" />
                </asp:GridView>
                </td>
            </tr>
        </table>
   
    </div>
    </form>
</body>
</html>
Listagem 02: Código Aspx do WebForm.

Codificando o Exemplo

Primeiramente deveremos importar algumas bibliotecas de extrema importância, veja abaixo:

using System;
using System.Configuration;
using System.Data;
using System.Linq;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.HtmlControls;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Xml.Linq;
using System.Xml;

Achei necessário criar um método do tipo “Internal” para podermos controlar o índice dos dados que foram selecionados no GridView. Através deste índice conseguimos posicionar no item selecionado para efetuarmos todas as operações que iremos detalhar daqui para frente.

internal int selectIndex
{
      get
      {
          if (this.Session["Page_selectIndex"] == null)
              return -1;

return Int32.Parse(this.Session["Page_selectIndex"].ToString());
      }
      set
      {
          this.Session["Page_selectIndex"] = value;
      }
}

Com os métodos “Get” e “Set” podemos atribuir e receber valores, que nada mais é do que o índice do registro que está selecionado.

Já nas funções “CarregaDadosXML” e “ProcuraDadosXML” teremos respectivamente que alimentar o GridView e selecionar o registro de acordo com o índice.

private void carregaDadosXML()
{
     DataSet ds = new DataSet();
     ds.ReadXml(Server.MapPath("theclub.xml"));

     if (ds.Tables.Count > 0)
     {
         this.GridDados.DataSource = ds;
         this.GridDados.DataBind();
     }
}

Crie um objeto do tipo DataSet e com o método “ReadXML” carregaremos o XML para o mesmo. Depois de atribuído faremos uma condição para testar se possui dados e logo em seguida usaremos o método DataSource (atribuir o resultset) e DataBind (aplicar as alterações) do Gridview para finalizar a tarefa.


private void procuraDadosXml(int selectedIndex)
{
    XmlDocument xmldoc = new XmlDocument();
    xmldoc.Load(Server.MapPath(@"theclub.xml"));
    XmlNodeList xmlnodelist = xmldoc.DocumentElement.ChildNodes;
    XmlNode xmlnode = xmlnodelist.Item(selectedIndex);
    this.txtNome.Text = xmlnode["nome"].InnerText;
    this.txtCidade.Text = xmlnode["cidade"].InnerText;
    this.txtObservacao.Text = xmlnode["observacao"].InnerText;
}

Teremos como parâmetro de entrada o índice selecionado. Usaremos a classe “XMLDocument” para ler o arquivo XML, a “XMLNodeList” e a “XMLNode” para carregar os nós deste mesmo XML de acordo com o ítem selecionado. Com a propriedade “InnerText”e respeitando o índice ou o nome dos nós, atribuiremos os dados para os textBoxes Nome, Cidade e Observação.


protected void Page_Load(object sender, EventArgs e)
{
    if (!Page.IsPostBack)
    {
        carregaDadosXML();
        this.Session["Incluir"] = 0;
    }
}

No método “Page_Load” invocaremos a função “CarregaDadosXML” e deixaremos como 0 para variável de sessão Incluir. (Para assim termos controle de como e quando iremos incluir os registros)


protected void btnIncluir_Click(object sender, EventArgs e)
{
    if ((int)Session["Incluir"] == 1)
    {
if (txtNome.Text.Equals("") || txtCidade.Text.Equals("") ||     txtObservacao.Text.Equals(""))
         {
Response.Write("Preencha os campos do formulário!");
         }
         else
         {
              XmlDocument xmldoc = new XmlDocument();
              xmldoc.Load(Server.MapPath("theclub.xml"));
        
XmlElement novoelemento = xmldoc.CreateElement("theclub");
XmlElement xmlNome = xmldoc.CreateElement("nome");
XmlElement xmlCidade = xmldoc.CreateElement("cidade");
XmlElement xmlObservacao = xmldoc.CreateElement("observacao");

xmlNome.InnerText = this.txtNome.Text.Trim();
xmlCidade.InnerText = this.txtCidade.Text.Trim();
xmlObservacao.InnerText = this.txtObservacao.Text.Trim();

              novoelemento.AppendChild(xmlNome);
              novoelemento.AppendChild(xmlCidade);
              novoelemento.AppendChild(xmlObservacao);

xmldoc.DocumentElement.AppendChild(novoelemento);
              xmldoc.Save(Server.MapPath("theclub.xml"));
              this.Session["Incluir"] = 0;
              carregaDadosXML();
        }
     }
     else
     {
Response.Write("Limpe os campos do formulário para incluir um novo  item!");
     }
}
  
No evento Click do botão Incluir, primeiramente faremos uma condição para verificar se os campos do Webform está preenchido ou não, caso afirmativo carregaremos o arquivo XML e adicionamos um novo elemento usando a classe “XMLElement” junto com método “AppendChild”. Finalizamos com o “Save” e o “CarregaDadosXML”.

   
protected void btnAlterar_Click(object sender, EventArgs e)
{
     if (selectIndex == -1)
     {
Response.Write("Selecione um item para alteração!");
     }
     else
     {
          XmlDocument xmldoc = new XmlDocument();
          xmldoc.Load(Server.MapPath(@"theclub.xml"));
XmlNode xmlnode = xmldoc.DocumentElement.ChildNodes.Item(selectIndex);

xmlnode["nome"].InnerText = this.txtNome.Text.Trim();
xmlnode["cidade"].InnerText = this.txtCidade.Text.Trim();
xmlnode["observacao"].InnerText = this.txtObservacao.Text.Trim();
     xmldoc.Save(Server.MapPath(@"theclub.xml"));

          carregaDadosXML();
     }
}

No Botão alterar, faremos o uso do SelectedIndex para nos certificar se foi selecionado algum item no GridView. Utilizando a mesma lógica acima, carregamos e localizamos os dados para posteriormente gravarmos no arquivo XML.


protected void btnExcluir_Click(object sender, EventArgs e)
{
     if (selectIndex == -1)
     {
Response.Write("Selecione um item para excluir!");
     }
     else
     {
          XmlDocument xmldoc = new XmlDocument();
          xmldoc.Load(Server.MapPath(@"theclub.xml"));
XmlNode xmlnode = xmldoc.DocumentElement.ChildNodes.Item(selectIndex);
          xmlnode.ParentNode.RemoveChild(xmlnode);
          xmldoc.Save(Server.MapPath(@"theclub.xml"));

          carregaDadosXML();
          this.txtNome.Text = "";
          this.txtCidade.Text = "";
          this.txtObservacao.Text = "";
     }
}

Teremos o mesmo trabalho explicado no botão alterar, devemos nos atentar no método “RemoveChild()”, o qual irá realizar a exclusão dos dados selecionados.

protected void btnLimpar_Click(object sender, EventArgs e)
{
    this.txtNome.Text = "";
    this.txtCidade.Text = "";
    this.txtObservacao.Text = "";
    this.txtNome.Text = "NOVO";
    this.txtNome.Focus();
    Session["Incluir"] = 1;
}

Já neste método limparemos os campos do WebForm e determinamos o Foco utilizando a função “Focus()”.

protected void GridView1_SelectedIndexChanged(object sender, EventArgs e)
{
    selectIndex = this.GridDados.SelectedIndex;
    procuraDadosXml(selectIndex);
    this.Session["Incluir"] = 0;
}
O método “SelectedIndexChanged” do GridView é disparado no momento que selecionamos o item, seguindo o “procuraDadosXML”.

protected void GridView1_PageIndexChanging(object sender, GridViewPageEventArgs e)
{
    carregaDadosXML();
    GridDados.PageIndex = e.NewPageIndex;
    GridDados.DataBind();
}

Já o “PageIndexChanging()” quando temos mais de uma página no GridView. É necessário carregar os dados no GridView junto com o índice da página (Neste caso uma página nova). Na Figura 03 podemos conferir o resultado final.

 

Figura 03: Exemplo em Run-time.

Conclusões

A intenção principal deste artigo foi de abordar os principais comandos envolvendo arquivos XML junto com Asp.Net. Demonstrei e expliquei as classes e métodos envolvidas ao decorrer do desenvolvimento. A vantagem da utilização de arquivos XML é que não precisaremos de nenhum Banco de Dados conectado, tornando muito rápida e prática nossa aplicação.

Espero que tenham gostado, um abraço e até a próxima.

Referências

 

Nenhum comentário:

Postar um comentário