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
&amp 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 &amp; 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:


José Carlos Macoratti