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:
- 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.
- 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">
</td>
<td>
<asp:Button ID="btnIncluir" runat="server" onclick="btnIncluir_Click"
Text="Incluir" />
<asp:Button ID="btnAlterar"
runat="server"
Text="Alterar"
onclick="btnAlterar_Click"
/>
<asp:Button ID="btnExcluir"
runat="server"
Text="Excluir"
onclick="btnExcluir_Click"
/>
<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
http://msdn.microsoft.com/pt-br/library/system.xml.xmldocument(v=vs.110).aspx
http://msdn.microsoft.com/pt-br/library/system.xml.xmlelement(v=vs.110).aspx
http://msdn.microsoft.com/pt-br/library/system.xml.xmlnodelist(v=vs.110).aspx
http://msdn.microsoft.com/pt-br/library/system.xml.xmlnode(v=vs.110).aspx
http://msdn.microsoft.com/pt-br/library/system.xml.xmlelement(v=vs.110).aspx
http://msdn.microsoft.com/pt-br/library/system.xml.xmlnodelist(v=vs.110).aspx
http://msdn.microsoft.com/pt-br/library/system.xml.xmlnode(v=vs.110).aspx
Nenhum comentário:
Postar um comentário