XML (C#) - Revisão - Conceitos Básicos - 2
Este é o segundo artigo do resumo dos conceitos básicos sobre XML com C#.
No primeiro artigo eu apresentei um resumo sobre os conceitos básicos sobre a XML.
A XML é uma linguagem independente de plataforma, dessa forma a informação formatada em XML pode ser utilizada em quaisquer outras plataformas (sistemas operacionais). Uma vez que você crie um arquivo XML você pode usá-lo em praticamente qualquer outra plataforma.
Criando XML
Para criar um novo arquivo XML na linguagem C#, vamos usar a classe XmlTextWriter.
A classe XmlTextWriter fornece uma maneira rápida de gerar streams ou arquivos contendo dados XML em conformidade com a W3C Extensible Markup Language (XML) 1.0. Ela contém diversos métodos e propriedades que vão fazer todo o trabalho pesado para você na prática.
Para usar esta classe basta você usar os namespace System.Xml e criar um novo objeto XmlTextWriter;em seguida basta ir incluindo os elementos Xml que você deseja criar. A classe comporta métodos para incluir cada tipo de elemento em um arquivo XML. A seguir temos alguns destes métodos:
Método | Descrição |
WriterStartDocument | Escreve a declaração XML indicativa da versão XML (version "1.0") |
WriteEndDocument | Fecha qualquer elemento ou atributo aberto. |
Close | Fecha o stream. |
WriteDocType | Escreve a declaração DOCTYPE com o nome especificado e atributos opcionais. |
WriterStartElement | Escreve tag de inicio definida. |
WriteEndElement | Fecha um elemento. |
WriteFullEndElement | Fecha um elemento. |
WriteElementString | Escreve um elemento contendo um valor string. |
WriteStartAttribute | Escreve o início de um atributo. |
WriteEndAttribute | Fecha a chamada anterior de WriteStarttAttribute. |
WriterString | Escreve uma string. |
WriteAttributes | Escreve um atributo com um valor específico.. |
WriteCData | Escreve um bloco <![CDATA[...]]> contendo o texto especificado.. |
WriteComment | Escreve um comentário <!--...--> contendo o texto especificado. |
WriteWhitespace | Escreve um espaço. |
WriteProcessingInstruction | Escreve uma instrução de processamento com um espaço entre o nome e o texto seguido de <?name text?>. |
De forma geral, para gerar XML usando a classe XmlTexWriter , você vai efetuar os seguintes passos:
Como exemplo vamos supor que você deseja gerar um arquivo XML chamado filmes.xml contendo informações sobre filmes com a seguinte estrutura:
<?xml version="1.0
encoding="utf-8"> <filmes> <titulo>Casa & Companhia</titulo> <titulo>007 contra Godzila</titulo> <titulo>O segredo do Sr Spock's</titulo> </filmes> |
Este arquivo contém o cabeçalho padrão XML , a tag root (<filmes>) e os elementos titulo.
Os namespaces usados são:
using
System;
using System.Data;
using System.Windows.Forms;
using System.Xml;
O código C# para gerar este arquivo usando a classe XmlTextWriter é dado abaixo:
private void btnCriarXML_Click(object sender, EventArgs e) { try { XmlTextWriter writer = new XmlTextWriter(@"c:\dados\filmes.xml", null); //inicia o documento xml writer.WriteStartDocument(); //escreve o elmento raiz writer.WriteStartElement("filmes"); //Escreve os sub-elementos writer.WriteElementString("titulo", "Cada & Companhia"); writer.WriteElementString("titulo", "007 contra Godzila"); writer.WriteElementString("titulo", "O segredo do Dr. Haus's"); // encerra o elemento raiz writer.WriteEndElement(); //Escreve o XML para o arquivo e fecha o objeto escritor writer.Close(); MessageBox.Show("Arquivo XML gerado com sucesso."); } catch (Exception ex) { MessageBox.Show(ex.Message); } } |
Se você quiser incluir um comentário e efetuar a formatação do arquivo deverá incluir as linhas abaixo no código .
Você pode inserir estas linhas após o comando writer.WriteStartDocument();
..... //define a indentação do arquivo writer.Formatting = Formatting.Indented; //escreve um comentário writer.WriteComment("Arquivos de filmes"); ..... |
A execução do código (no exemplo o código foi colocado no evento Click de um Button) gera o arquivo filmes.xml na pasta c:\dados que pode ser aberto no seu navegador padrão conforme abaixo:
Vamos supor que você deseja incluir atributos nas suas tags XML .
No exemplo vamos incluir o atributo ano para indicar o ano de referência dos filmes;
O nosso arquivo filmes.xml deverá ter o seguinte formato:
<?xml version="1.0"?> <!--Arquivos de filmes--> <filmes ano="2012"> <titulo>Cada & Companhia</titulo> <titulo>007 contra Godzila</titulo> <titulo>O segredo do Dr. Haus's</titulo> </filmes> |
O código para obter este resultado é obtido usando o método WriteAttributeString();
private void btnCriarXML_Click(object sender, EventArgs e) { try { XmlTextWriter writer = new XmlTextWriter(@"c:\dados\filmes.xml", null); //inicia o documento xml writer.WriteStartDocument(); //define a indentação do arquivo writer.Formatting = Formatting.Indented; //escreve um comentário writer.WriteComment("Arquivos de filmes"); //escreve o elmento raiz writer.WriteStartElement("filmes"); //escrever o atributo ano com valor 2007 writer.WriteAttributeString("ano", "2012"); //Escreve os sub-elementos writer.WriteElementString("titulo", "Cada & Companhia"); writer.WriteElementString("titulo", "007 contra Godzila"); writer.WriteElementString("titulo", "O segredo do Dr. Haus's"); // encerra o elemento raiz writer.WriteEndElement(); //Escreve o XML para o arquivo e fecha o objeto escritor writer.Close(); MessageBox.Show("Arquivo XML gerado com sucesso."); } catch (Exception ex) { MessageBox.Show(ex.Message); } } |
Você pode usar e abusar dos recursos da classe XmlTextWriter para gerar arquivos XML com qualquer elementos e atributos.
Com base no exemplo acima poderíamos usar o seguinte código:
private void GeraXML() { XmlTextWriter writer = new XmlTextWriter(@"c:\dados\filmes2.xml", null); //inicia o documento xml writer.WriteStartDocument(); //Usa a formatação writer.Formatting = Formatting.Indented; //Escreve o elemento raiz writer.WriteStartElement("filmes"); //Inicia um elemento writer.WriteStartElement("filme"); //Inclui um atributo ao elemento writer.WriteAttributeString("classificacao", "R"); //e sub-elementos writer.WriteElementString("titulo", "Matrix"); writer.WriteElementString("formato", "DVD"); //encerra os elementos itens writer.WriteEndElement(); // encerra o item //escreve alguns espaços entre os nodes writer.WriteWhitespace(""); //escreve um segundo elemento usando um raw de dados strings writer.WriteRaw("<filme>" + "<titulo>007 contra Godzila</titulo>" + "<formato>DVD</formato>" + "</filme>"); //escreve o terceiro elemento na string writer.WriteRaw("" + " <filme>" + "" + " <titulo>O segredo do Dr. Hauss´s</titulo>" + "" + " <formato>CD</formato>" + "" + " </filme>" + ""); // encerra o elemento raiz writer.WriteFullEndElement(); //escreve o XML para o arquivo e fecha o escritor writer.Close(); } |
Note que estou usando o método WriteRaw para escrever uma string contendo elementos e outros comandos de formatação.
O resultado será a geração do arquivo filmes2.xml na pasta c:\dados conforme visto abaixo no navegador padrão:
Para ler exibir o arquivo XML podemos usar o método ReadXml do objeto DataSet conforme o código abaixo:
private void btnLerXML_Click(object sender, EventArgs e) { DataSet ds = new DataSet(); ds.ReadXml(@"c:\dados\filmes2.xml"); dgvXML.DataSource = ds.Tables[0].DefaultView; } |
O resultado pode ser visto abaixo em um controle DataGridView:
O comando ReadXml irá inferir o esquema do arquivo e construir a tabela equivalente com os dados XML.
Existe também o método ReadXmlSchema para ler um esquema pré-definido mas isso é assunto para o próximo artigo sobre XML...
Pegue o projeto completo aqui: CriandoXML.zip
Veja mais sobre o assunto em : Revisão - Conceitos Básicos - 3 - Lendo XML - 3
Salmos 13:1
Até quando, ó Senhor, te esquecerás de mim? para sempre? Até quando esconderás de mim o teu rosto?Salmos 13:2
Até quando encherei de cuidados a minha alma, tendo tristeza no meu coração cada dia? Até quando o meu inimigo se exaltará sobre mim?Salmos 13:3
Considera e responde-me, ó Senhor, Deus meu; alumia os meus olhos para que eu não durma o sono da morte;Salmos 13:4
para que o meu inimigo não diga: Prevaleci contra ele; e os meus adversários não se alegrem, em sendo eu abalado.Salmos 13:5
Mas eu confio na tua benignidade; o meu coração se regozija na tua salvação.Salmos 13:6
Cantarei ao Senhor, porquanto me tem feito muito bem.Referências: