 VB.NET - Gerando e 
manipulando XML
   
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:
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 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.IO 
	 ' cria um arquivo Dim arquivo As String = "arquivo.xml" ' Cria um FileStream para escritaDim 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
 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:
Super DVD Vídeo Aulas - Vídeo Aula sobre VB .NET, ASP .NET e C#
Super DVD C# - Recursos de aprendizagens e vídeo aulas para C#
Curso Fundamentos da Programação Orientada a 
Objetos com VB .NET

C# - Lendo, Incluindo e Atualizado dados de uma planilha ...