VB.NET - Gerando e manipulando XML


Começo este artigo apresentando uma relação de links de meus artigos sobre XML , então parafraseando aquela famosa música, "para não falar que não falei sobre XML..."

Apresentando 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?>.

 

Se você esta confuso quanto a finalidade de cada método da tabela aconselho a ler os artigos citados no início sobre XML que apresentam os conceitos básicos sobre a linguagem.

 

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 titulos.

 

 

O código Visual Basic usado para gerar este arquivo poderia ser definido da seguinte forma no Visual Basic 2005 Express Edition.

 

Inicie o VB 2005 Express e crie um projeto chamado geraXML. A seguir no formulário padrão form1.vb inclua um botão de comando com os dizeres : Gera XML.

 

No evento Click do botão inclua o seguinte código:

 

Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click

 

Try

   Dim writer As New XmlTextWriter("filmes.xml", Nothing)

 

  '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()

  MsgBox("Arquivo XML gerado com sucesso.")

 

Catch ex As Exception

  MsgBox(ex.Message)

End Try
 

End Sub

 

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")

 ..............

 

O resultado final obtido será o arquivo filmes.xml com a seguinte estrutura:

 

<?xml version="1.0"?>

<!--Arquivos de filmes-->

<filmes>

    <titulo>Cada &amp; Companhia</titulo>

    <titulo>007 contra Godzila</titulo>

    <titulo>O segredo do Dr. Haus's</titulo>

</filmes>

 

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; nosso arquivo filmes.xml deverá ter o seguinte formato:

 

<?xml version="1.0"?>

<!--Arquivos de filmes-->

<filmes ano="2007">

    <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 Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click

 

Try

   Dim writer As New XmlTextWriter("filmes.xml", Nothing)


   'inicia o documento xml

   writer.WriteStartDocument()


   'define a indentação do arquivo

   writer.Formatting = Formatting.Indented

 

   'escreve um comentario

   writer.WriteComment("Arquivos de filmes")

 

   'escreve o elmento raiz

   writer.WriteStartElement("filmes")

 

   'escrever o atributo ano com valor 2007

   writer.WriteAttributeString("ano", "2007")

 

   '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()

  MsgBox("Arquivo XML gerado com sucesso.")

 

Catch ex As Exception

  MsgBox(ex.Message)

End Try
 

End Sub

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 Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click


Dim writer As New XmlTextWriter("filmes2.xml", Nothing)

 

'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("" & Chr(10) & "")

 

'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("" & Chr(10) & " <filme>" & Chr(10) & "" + " <titulo>O segredo do Dr. Hauss´s</titulo>" & Chr(10) & "" + " <formato>CD</formato>" & Chr(10) & "" + " </filme>" & Chr(10) & "")

 

' encerra o elemento raiz

writer.WriteFullEndElement()

 

'escreve o XML para o arquivo e fecha o escritor

writer.Close()

End Sub

O arquivo XML obtido que eu chamei de filmes2.xml, para não sobrepor o arquivo anterior, teria a seguinte estrutura:

<?xml version="1.0"?>

<filmes>

   <filme classificacao="R">

       <titulo>Matrix</titulo>

       <formato>DVD</formato>

</filme>

<filme><titulo>007 contra Godzila</titulo><formato>DVD</formato></filme>

<filme>

    <titulo>O segredo do Dr. Haussïs</titulo>

    <formato>CD</formato>

</filme>

</filmes>

Note que estou usando o método WriteRaw para escrever uma string contendo elementos e outros comandos de formatação.

A forma mais simples de exibir o conteúdo do arquivo XML gerado é usar o método ReadXml do objeto dataset . Vamos incluir um novo botão no formulário do projeto com o texto - Exibe XML e no seu evento Click incluir o código abaixo:

Private Sub Button3_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button3.Click

Dim ds As New DataSet

ds.ReadXml("filmes.xml")

DataGridView1.DataSource = ds.Tables(0).DefaultView

End Sub

Executando o projeto e exibindo o xml gerado teremos o seguinte resultado:

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.

O mesmo exemplo para uma página ASP.NET poderia usar o seguinte código para ler o arquivo xml:

protected sub ReadXmlDemo ( )
   ' inicializa o objeto
   dim ds as new DataSet ( );

   ' le o arquivo xml em um dataset
   ds.ReadXml ( Server.MapPath ( "/filmes.xml" ) )

   ' chama o método para exibir o conteúdo do dataset
   exibeDados ( ds )
end sub

O método WriteXml pode ser usado para gerar um arquivo XML  e opcionalmente o seu esquema para um o objeto dataset.

Abaixo temos um exemplo onde o método WriteXML é usado para criar um arquivo XML a partir de um dataset.

imports System.Xml
Imports System.Text

Imports System.IO

Private Sub escreveXML(ByVal ds As DataSet)


If ds Is Nothing Then

    Return

End If
 

' cria um arquivo

Dim arquivo As String = "arquivo.xml"

' Cria um FileStream para escrita

Dim mFileStream As New FileStream(arquivo, FileMode.Create)

 

' Cria um XmlTextWriter com o fileStream.

Dim mXmlWriter As New XmlTextWriter(mFileStream,Encoding.Unicode)

 

' escreve para o arquivo usando o método WriteXml

ds.WriteXml(mXmlWriter)

mXmlWriter.Close()

 

End Sub

Manipular e criar arquivos XML com os novos recursos do .NET Framework 2.0 é muito simples.

Apenas para você comparar , e, para matar a curiosidade, abaixo transcrevo um código geralmente usado para gerar arquivo XML usando ASP e ADO.

<!-- #include file="adovbs.inc" -->
<%

' verifica se o arquivo existe usando o objeto FileSystemObject
Dim oFSO
Set oFSO = Server.CreateObject("Scripting.FileSystemObject")

'se o arquivo existir deleta-o
If oFSO.FileExists(Server.MapPath("arquivo.xml")) Then
    oFSO.DeleteFile Server.MapPath("arquivo.xml")
End IF

Set oFSO = Nothing

' Declarar as variáveis para conexão ADO e recordset ADO
Dim conn
Dim rs

' Cria uma conexão ADO.
Set conn = Server.CreateObject("ADODB.Connection")

'Efetua a conexão com o banco de dados Access Teste.mdb
conn.Open "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=Server.MapPath("Teste.mdb");

' Executa a consulta na tabela : Tabela e gera um recordset
Set rs = Server.CreateObject("ADODB.Recordset")
Set rs = conn.Execute("SELECT * FROM tabela;")

Response.Write "<p>Gerando o arquivo XML, aguarde...</p>" & vbCrLf

' Grava o arquivo xml
rs.Save Server.MapPath("arquivo.xml"), adPersistXML

' Fecha e libera os objetos uados
rs.Close
Set rs = Nothing
conn.Close
Set conn = Nothing

Response.Write "<p>O arquivo XML foi gerado com sucesso.</p>" & vbCrLf
Response.Write "<p>Clique <a href=""arquivo.xml"">aqui</a> para ver o arquivo XML gerado.</p>" & vbCrLf
%>

Dá para sentir saudades ???

Nota: Com ASP.NET também temos a disposição o XMLDataSource. Para saber mais veja o  meu artigo:  ASP  .NET - Usando XmlDataSource

Pegue o projeto completo aqui :  geraXML.zip

Até o próximo artigo .NET 

Veja os Destaques e novidades do SUPER DVD Visual Basic (sempre atualizado) : clique e confira !

Quer migrar para o VB .NET ?

Quer aprender C# ??

Quer aprender os conceitos da Programação Orientada a objetos ?

Quer aprender o gerar relatórios com o ReportViewer no VS 2013 ?

Referências:


José Carlos Macoratti