Fórum XML como Banco de Dados #10611
28/10/2009
0
Fernando Reis
Curtir tópico
+ 0Posts
28/10/2009
Luiz Maia
Frederico da Silva
25
Gerente Para carregar o Xml que está em um arquivo fisico “Artigo_XML.xml” utilizamos o método Load(arquivo.xml). Criação do Arquivo xml: string caminho = @”C:\Artigo_XML.xml”; if (!File.Exists(caminho))
{
XmlDocument doc = new XmlDocument();
XmlNode raiz = doc.CreateElement(“empresa”);
doc.AppendChild(raiz);
doc.Save(caminho);
} Se o arquivo não existir ele cria o arquivo xml, sendo necessário a inserção de um elemento Root neste exemplo
representado pelo elemento “empresa”. Inserir Registro: Depois de criado precisamos muitas vezes inserir as informações no arquivo xml já existente, com isso precisamos inserir novos elementos utilizando o Método AppendChild. XmlDocument doc = new XmlDocument(); string caminho = @”C:\Artigo_XML.xml”; doc.Load(caminho); XmlNode linha = doc.CreateElement(“funcionario”); XmlNode Id = doc.CreateElement(“id”);
XmlNode Nome = doc.CreateElement(“nome”);
XmlNode Idade = doc.CreateElement(“idade”);
XmlNode Cargo = doc.CreateElement(“cargo”); Id.InnerText = “11″;
Nome.InnerText = “Mario da Silva”;
Idade.InnerText = “35″;
Cargo.InnerText = “Financeiro”; linha.AppendChild(Id);
linha.AppendChild(Nome);
linha.AppendChild(Idade);
linha.AppendChild(Cargo); doc.SelectSingleNode(“/empresa”).AppendChild(linha); doc.Save(caminho); Alterar Registro: Para a alteração de um elemento do xml podemos utilizar: XmlDocument doc = new XmlDocument(); string caminho = @”C:\Artigo_XML.xml”; doc.Load(caminho);
XmlNode no;
no = doc.SelectSingleNode(String.Format(“/empresa/funcionario[id=]“, 10));
no.SelectSingleNode(“./cargo”).InnerText = “Gerente Administrativo”;
doc.Save(caminho); Altera as informações do Funcionário Frederico da Silva baseado no seu id. Deletar Registro: Para Deletar um elemento do xml baseado em uma condição podemos utilizar: XmlDocument doc = new XmlDocument(); string caminho = @”C:\Artigo_XML.xml”; doc.Load(caminho); foreach (XmlNode no in doc.DocumentElement.ChildNodes)
{
if (int.Parse(no.ChildNodes.Item(0).InnerText) == 10)
{
doc.DocumentElement.RemoveChild(no);
doc.Save(caminho);
return;
}
} Com este exemplo acima, vc já é capaz de gerar sua Base de Dados baseada em XML. Caso precise de mais algo, me diga que providencio para vc, ok? Abraços Att Luiz Maia
Gostei + 0
28/10/2009
Fernando Reis
Gostei + 0
28/10/2009
Luiz Maia
{
Console.WriteLine(reader.Name);
}
Console.ReadLine();
Em seguida verificamos e o dataset foi preenchido e exibimos o resultado no GridView. Limpando o formulário Vamos mostrar agora o código associado ao evento Click do botão Limpar: protected void btnLimpar_Click(object sender, EventArgs e) { this.TextBox1.Text = ""; this.TextBox2.Text = ""; this.TextBox3.Text = ""; this.TextBox1.Text = "NOVO"; this.TextBox1.Focus(); Session["Incluir"] = 1; } Este código apenas limpa o conteúdo das caixas de texto do formulário web. Lembre-se que eu defini uma variável de sessão chamada Incluir no evento Load e atribui um valor inicial zero. Ao limpar o conteúdo das caixas de texto eu estou alterando o seu valor para 1. Dessa forma eu posso controlar a inclusão da seguinte forma. O usuário somente poderá incluir valores após limpar as caixas de texto ou seja quando o valor da variável de sessão Incluir for igual a 1. Se o usuário tentar incluir uma informação irá receber uma mensagem solicitando que os campos sejam limpos. Incluindo dados Vejamos então o código do evento Click do botão Incluir: protected void btnIncluir_Click(object sender, EventArgs e) { if ((int)Session["Incluir"] == 1) { if (TextBox1.Text.Equals("") || TextBox2.Text.Equals("") || TextBox3.Text.Equals("")) { this.RegisterClientScriptBlock("alertmessage", "<script>alert('Preencha os campos do formulário.')</script>"); } else { //define um documento XML e carrega o seu conteúdo XmlDocument xmldoc = new XmlDocument(); xmldoc.Load(Server.MapPath(@"App_Data\poemas.xml")); //Cria um novo elemento poemas e define os elementos autor, titulo e conteudo XmlElement novoelemento = xmldoc.CreateElement("poemas"); XmlElement xmlAutor = xmldoc.CreateElement("autor"); XmlElement xmlTitulo = xmldoc.CreateElement("titulo"); XmlElement xmlConteudo = xmldoc.CreateElement("conteudo"); //atribui o conteúdo das caixa de texto aos elementos xml xmlAutor.InnerText = this.TextBox1.Text.Trim(); xmlTitulo.InnerText = this.TextBox2.Text.Trim(); xmlConteudo.InnerText = this.TextBox3.Text.Trim(); //inclui os novos elementos no elemento poemas novoelemento.AppendChild(xmlAutor); novoelemento.AppendChild(xmlTitulo); novoelemento.AppendChild(xmlConteudo); //inclui o novo elemento no XML xmldoc.DocumentElement.AppendChild(novoelemento); //Salva a inclusão no arquivo XML xmldoc.Save(Server.MapPath(@"App_Data\poemas.xml")); this.Session["Incluir"] = 0; //exibe os dados no GridView carregaDadosXML(); } } else { this.RegisterClientScriptBlock("alertmessage", "<script>alert('Limpe os campos do formulário para incluir um novo item.')</script>"); } } Primeiro verificamos se a nossa variável de sessão Incluir tem o valor 1. Se o valor for diferente exibiremos a mensagem : 'Limpe os campos do formulário para incluir um novo item'. this.RegisterClientScriptBlock("alertmessage", "<script>alert('Limpe os campos do formulário para incluir um novo item.')</script>"); Estamos fazendo isso usando o método RegisterClientScriptBlock que permite que você coloque uma função JavaScript no topo da página. A partir da ASP.NET 2.0 usa a nova propriedade Page.ClientScript para registrar e colocar funções JavaScript em suas páginas ASP.NET, os métodos Page.RegisterStartUpScript e Page.RegisterClientScriptBloc da versão 1.0/1.1 da plataforma .NET podem ser considerados obsoletos pois agora você tem que fornecer o conjunto de parâmetros chave/script para registrar scripts do lado do cliente. Para detalhes veja o meu artigo: ASP.NET - Messagebox Em seguida usamos o mesmo recurso para exibir uma mensagem ao usuário caso as caixas de textos não forem preenchidas. this.RegisterClientScriptBlock("alertmessage", "<script>alert('Preencha os campos do formulário.')</script>"); Satisfeitas estes critérios começamos o processo de inclusão de uma nova informação no arquivo poemas.xml. Estamos criando uma instância da classe XmlDocument que representa o documento XML e contém um método Load para carregar o documento a partir de um arquivo, fluxo ou XmlReader. XmlDocument xmldoc = new XmlDocument();
xmldoc.Load(Server.MapPath(@"App_Data\poemas.xml"));
A seguir criamos novos elementos usando o método CreateElement da classe XmlDocument. //Cria um novo nó poemas e define os elementos autor, titulo e conteudo para este nó
XmlElement novoelemento = xmldoc.CreateElement("poemas");
XmlElement xmlAutor = xmldoc.CreateElement("autor");
XmlElement xmlTitulo = xmldoc.CreateElement("titulo");
XmlElement xmlConteudo = xmldoc.CreateElement("conteudo") Embora esse método cria o novo objeto no contexto do documento, ele automaticamente não adicionar o novo objeto à árvore de documento. Para adicionar o novo objeto, você deve explicitamente chamar um dos métodos inserir do nó. A seguir estamos atribuindo os valores informados na caixa de texto aos elementos criados usando a propriedade InnerText que obtêm ou define valores concatenados do nó e todos os seus nós filhos. //atribui o conteúdo das caixa de texto aos elementos criados
xmlAutor.InnerText = this.TextBox1.Text.Trim();
xmlTitulo.InnerText = this.TextBox2.Text.Trim();
xmlConteudo.InnerText = this.TextBox3.Text.Trim(); Agora incluímos os elementos criados ao nó poemas usando o método AppendChild que inclui um novo nó ao fim da lista de nó filhos para o nó atual. //inclui os elementos no novo nó
novoelemento.AppendChild(xmlAutor);
novoelemento.AppendChild(xmlTitulo);
novoelemento.AppendChild(xmlConteudo); Incluímos então o novo nó poemas ao nó raiz do documento XML. //inclui o novo elemento no XML
xmldoc.DocumentElement.AppendChild(novoelemento); Finalmente salvamos o documento XML para o arquivo especificado e exibimos os dados no GridView. //Salva a inclusão no arquivo XML
xmldoc.Save(Server.MapPath(@"App_Data\poemas.xml"));
this.Session["Incluir"] = 0;
//exibe os dados no GridView
carregaDadosXML(); Alterando dados Veremos agora o código do evento Click do botão Alterar: protected void btnAlterar_Click(object sender, EventArgs e) { if (selectIndex == -1) { this.RegisterClientScriptBlock("alertmessage", "<script>alert('Selecione um item para alteração.')</script>"); } else { XmlDocument xmldoc = new XmlDocument(); xmldoc.Load(Server.MapPath(@"App_Data\poemas.xml")); XmlNode xmlnode = xmldoc.DocumentElement.ChildNodes.Item(selectIndex); xmlnode["autor"].InnerText = this.TextBox1.Text.Trim(); xmlnode["titulo"].InnerText = this.TextBox2.Text.Trim(); xmlnode["conteudo"].InnerText = this.TextBox3.Text.Trim(); xmldoc.Save(Server.MapPath(@"App_Data\poemas.xml")); carregaDadosXML(); } } Aqui destacamos o uso da propriedade DocumentElement que obtêm a raiz XmlElement para o documento; e a propriedade ChildNodes que contêm uma lista de nós de todos os filhos os elementos. Estamos obtendo os valores para os elementos do índice indicado que é capturado a partir da seleção de uma linha do controle GridView. Para obter o valor do índice definimos a propriedade selectIndex conforme o código abaixo: 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; } } A palavra-chave Internal é um modificador de acesso para tipos de membros que são acessíveis somente no mesmo assembly. Em C# as classes que não possuírem uma modificador de acesso, são por default internal. Com isso estamos obtendo o valor do índice selecionado a partir do controle GridView ou retornando o valor -1 e atribuindo o valor a partir da sessão. Após obter os valores das caixas de texto salvamos o XML para o documento poemas.xml: xmldoc.Save(Server.MapPath(@"App_Data\poemas.xml")); Para obter o índice atual do GridView quando o usuário selecionar uma linha temos que definir o código abaixo no evento SelectedIndexChanged: protected void GridView1_SelectedIndexChanged(object sender, EventArgs e) { selectIndex = this.GridView1.SelectedIndex; procuraDadosXml(selectIndex); this.Session["Incluir"] = 0; } Note que chamamos a rotina procuraDadosXml(indice) passando o índice selecionado. É esta rotina que irá buscar os dados no documento poemas.xml exibindo-os nas caixas de texto do formulário. Veja o código da rotina: private void procuraDadosXml(int selectedIndex) { XmlDocument xmldoc = new XmlDocument(); xmldoc.Load(Server.MapPath(@"App_Data\poemas.xml")); XmlNodeList xmlnodelist = xmldoc.DocumentElement.ChildNodes; XmlNode xmlnode = xmlnodelist.Item(selectedIndex); this.TextBox1.Text = xmlnode["autor"].InnerText; this.TextBox2.Text = xmlnode["titulo"].InnerText; this.TextBox3.Text = xmlnode["conteudo"].InnerText; } A classe XmlNodeList representa uma coleção ordenada de nós. Estamos obtendo a coleção de nós do documento XML e em seguida selecionando o nó referente ao índice selecionado. Quando o usuário clica no botão Alterar os novos valores são salvos para o arquivo XML: xmldoc.Save(Server.MapPath(@"App_Data\poemas.xml")); Excluindo dados O código associado ao evento Click do botão Excluir é dado a seguir: protected void btnExcluir_Click(object sender, EventArgs e) { if (selectIndex == -1) { this.RegisterClientScriptBlock("alertmessage", "<script>alert('Selecione um item para excluir.')</script>"); } else { XmlDocument xmldoc = new XmlDocument(); xmldoc.Load(Server.MapPath(@"App_Data\poemas.xml")); XmlNode xmlnode = xmldoc.DocumentElement.ChildNodes.Item(selectIndex); xmlnode.ParentNode.RemoveChild(xmlnode); xmldoc.Save(Server.MapPath(@"App_Data\poemas.xml")); carregaDadosXML(); this.TextBox1.Text = ""; this.TextBox2.Text = ""; this.TextBox3.Text = ""; } } Para excluir os dados de um nó XML usamos o método RemoveChild() passando o nó desejado. Dessa forma temos a implementação de todas as rotinas necessárias para gerenciar as informações de um arquivo XML. Talvez a interface pudesse ser melhorada e um tratamento de erros decente pudesse ser implementado. Tarefas que deixo a seu cargo para exercitar o aprendizado. Veja abaixo a figura do web site em execução e a estrutura do arquivo poemas.xml após algumas inclusões: <?xml version="1.0" encoding="utf-8"?> <poetas> <poemas> <autor>Fernando Pessoa</autor> <titulo>Tabacaria</titulo> <conteudo>Não sou nada. Nunca serei nada. Não posso querer ser nada. À parte isso, tenho em mim todos os sonhos do mundo.</conteudo> </poemas> <poemas> <autor>Fernando Pessoa</autor> <titulo>poesias coligidas</titulo> <conteudo>Eu amo tudo o que foi, Tudo o que já não é, A dor que já me não dói, A antiga e errônea fé, O ontem que dor deixou, O que deixou alegria Só porque foi, e voou E hoje é já outro dia.</conteudo> </poemas> </poetas>
Gostei + 0
28/10/2009
Fernando Reis
Gostei + 0
28/10/2009
Luiz Maia
Gostei + 0
28/10/2009
Fernando Reis
Gostei + 0
29/10/2009
Luiz Maia
Gostei + 0
23/11/2009
Fernando Reis
Se puder me ajudar enste mesmo assunto agradeço.
Tenho que usar este modelo em XML
Arquivo XML
<?xml version="1.0" encoding="iso-8859-1"?>
<rss version="2.0">
<channel>
<item>
<headline>Sabrosa y nutritiva</headline>
<subhead>Descubre las cualidades de la pasta e incorpórala a tu dieta</subhead>
<thumbtxt>Pastas: beneficios, secretos y variedades</thumbtxt>
<copyright>Foto: StockXPert.com</copyright>
<image url="http://blstb.msn.com/i/3F/9A74FDE90279A109547425C2F8BB.jpg" type="image/jpeg" />
<link>http://estilodevida.latam.msn.com/articulo.aspx?cp-documentid=1</link>
</item>
</channel>
</rss>
Veja o Código de Inserção no ASP.NET:
//Define um novo documento XML e Carrega o seu conteúdo
XmlDocument xmlDoc = new XmlDocument();
xmlDoc.Load(Server.MapPath(@"App_Data\rss2infopane.xml"));
//Define um novoelemento
XmlElement novoelemento = xmlDoc.CreateElement("item");
XmlElement xmlheadline = xmlDoc.CreateElement("headline");
XmlElement xmlsubhead = xmlDoc.CreateElement("subhead");
XmlElement xmlthumbtxt = xmlDoc.CreateElement("thumbtxt");
XmlElement xmlcopyright = xmlDoc.CreateElement("copyright");
XmlElement xmlImage = xmlDoc.CreateElement("image");
XmlElement xmlLink = xmlDoc.CreateElement("Link");
xmlheadline.InnerText = this.txtTitulo.Text.Trim();
xmlsubhead.InnerText = this.txtSubtitulo.Text.Trim();
xmlthumbtxt.InnerText = this.txtTextoMiniatura.Text.Trim();
xmlcopyright.InnerText = this.txtCopyright.Text.Trim();
//Arruma os atruibutos de Imagem
XmlAttribute attrurl = xmlDoc.CreateAttribute("url");
attrurl.Value = fuFoto.PostedFile.FileName.ToString();
XmlAttribute attrtype = xmlDoc.CreateAttribute("type");
attrtype.Value = fuFoto.PostedFile.ContentType.ToString();
xmlImage.SetAttributeNode(attrurl);
xmlImage.SetAttributeNode(attrtype);
xmlLink.InnerText = txtLink.Text.Trim();
novoelemento.AppendChild(xmlheadline);
novoelemento.AppendChild(xmlsubhead);
novoelemento.AppendChild(xmlthumbtxt);
novoelemento.AppendChild(xmlcopyright);
novoelemento.AppendChild(xmlImage);
novoelemento.AppendChild(xmlLink);
//xmlDoc.SelectNodes("/rss/channel");
xmlDoc.DocumentElement.AppendChild(novoelemento);
xmlDoc.Save(Server.MapPath(@"App_Data\rss2infopane.xml"));
this.Session["Incluir"]=0;
carregaDadosXML();
O resultado do xml fiuca desta forma:
<?xml version="1.0" encoding="iso-8859-1"?>
<rss version="2.0">
<channel>
<item>
<headline>Sabrosa y nutritiva</headline>
<subhead>Descubre las cualidades de la pasta e incorpórala a tu dieta</subhead>
<thumbtxt>Pastas: beneficios, secretos y variedades</thumbtxt>
<copyright>Foto: StockXPert.com</copyright>
<image url="http://blstb.msn.com/i/3F/9A74FDE90279A109547425C2F8BB.jpg" type="image/jpeg" />
<link>http://estilodevida.latam.msn.com/articulo.aspx?cp-documentid=1</link>
</item>
</channel>
<item>
<headline>dfsgdfg</headline>
<subhead>sdfgdfg</subhead>
<thumbtxt>sdfgdsfg</thumbtxt>
<copyright>sdfgdsfgsd</copyright>
<image url="blocklist.xml" type="text/xml" />
<Link>fgdsf</Link>
</item>
Ou seja os dados não ficam dentro da tag CHANNEL.
como posso arrumar isto?
Grato
Gostei + 0
24/11/2009
Luiz Maia
Gostei + 0
24/11/2009
Fernando Reis
Gostei + 0
24/11/2009
Luiz Maia
Gostei + 0
24/11/2009
Fernando Reis
Gostei + 0
24/11/2009
Fernando Reis
Gostei + 0
24/11/2009
Luiz Maia
Gostei + 0
24/11/2009
Fernando Reis
Como pegar a URl da Imagem???
eu usava normalmente o Eval(#"campo")
mas neste caso é uma propriedade do campo como fica???
Gostei + 0
Clique aqui para fazer login e interagir na Comunidade :)