VB.NET 2005 - 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:
| METHOD | DESCRIPTION |
| 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:
Criar um documento;
incluir elementos;
incluir sub-elementos;
incluir atributos;
fechar o documento;
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 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()
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 |
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();
|
................. 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 & 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 & 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)
writer.WriteStartDocument()
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 |
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
'inicia o documento xml writer.WriteStartDocument()
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 nodeswriter.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.IO
' 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 |
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
![]()
José Carlos Macoratti