VB.NET - Usando XML DOM


A plataforma .NET dá suporte a XML e foi concebida para usar extensivamente XML . Portanto é fundamental você ter noções básicas de XML e  conhecer quais os recursos disponíveis a plataforma oferece para tratar XML.

Para saber mais sobre XML leia os artigos :

A .NET Framework contém 5 principais assemblies que implementam o núcleo principal do padrão XML. A tabela a seguir lista estes assemblies e sua descrição.

Assembly Descrição
System.Xml Entrada e saída básica del XML com XmlReader e XmlWriter, DOM com XmlNode e suas subclasses; além de outras classes
System.Xml.Schema Constraint de XML via XML Schema com h XmlSchemaObject e suas subclasses
System.Xml.Serialization Serialization para XML e SOAP com XmlSerializer
System.Xml.XPath Navegação de XML via XPath com XPathDocument, XPathExpression, e XPathNavigator
System.Xml.Xsl Transformação de documentos XML documents via XSLT com XslTransform

Além disto os assemblies System.Web.Services e System.Data contém classes que interagem com assemblies XML. Os assemblies XML usados internamente no .NET Framework também estão disponíveis para uso diretamente em suas aplicações. Assim, por exemplo, o assemblie System.Data manipula operações com banco de dados. Sua classe DataSet fornece o mecanismo para transmitir alterações no banco de dados usando XML. Mas você pode acessar o XML gerado pelo DataSet e manipulá-lo como qualquer arquivo XML usando as classes do namespace System.Xm .

Nos assemblies XML do .NET Framework existem diversas ferramentas que integradas no VS.NET que podem tornar o tratamento com XML mais fácil. Estas ferramentas incluem : xsd.exe, wsdl.exe, e disco.exe, dentre outras.

A XML é muito flexível e pode ser usada em :

As aplicações .NET possuem acesso a arquivos de configuração do sistema e da aplicação, que estão no formato XML, através do assembly System.Configuration.

Existem duas técnicas que o VB.NET fornece para podermos trabalhar com XML

O DOM é a forma padrão recomendada pelo Word Wide Web Consortium para trabalhar com XML.

Ao usar o Document Object Model (DOM). cada No (Node) no documento XML é representado por uma classe definida, começando com uma classe abstrata, XMLNode. As classes derivadas de XMLNode são : XmlAttribute, XmlDocument, XmlDocumentFragment, XmlEntity, XmlLinkedNode, e XmlNotation.

A classe XmlLinkedNode possue um número de subclasses que server para propósitos específicos (XmlCharacterData, XmlDeclaration, XmlDocumentType, XmlElement, XmlEntityReference, e XmlProcessingInstruction)

Abaixo a estrutura de classes XML

Leitura usando XML

Antes de saber como ler arquivos XML, você precisa aprender como ler um arquivo usando as classes da plataforma .NET. Vou fazer uma pequena revisão do assunto.

Para efetuar operações com arquivos na plataforma .NET usamos as classes localizadas no namespace System.IO. O objeto básico para efetuar a leitura e a escrita é o objeto Stream que é uma classe abstrata que representa uma sequência de bytes; O método Read() da classe lê os bytes de um Stream, o método Write() escreve bytes para um Stream e o método Seek() define a localização atual no Stream.

Nem todas as instâncias ou subclasses do Stream suportam todas estas operações; você não pode escrever para um FileStream representando um arquivo de somente-leitura e você também não pode usar o método Seek() para posicionar-se em um NetworkStream. As propriedades CanRead, CanWrite, e CanSeek podem ser usadas para determinar se estas operações são suportadas pela instância de Stream que você esta tratando.

A tabela abaixo mostra as subclasses de Stream e seus métodos suportados:

Type Length Position Flush( ) Read( ) Seek( ) Write( )
System.IO.BufferedStream Sim Sim Sim Sim Sim Sim
System.IO.FileStream Sim Sim Sim Sim Sim Sim
System.IO.IsolatedStorage.IsolatedStorageFileStream Sim Sim Sim Sim Sim Sim
System.IO.MemoryStream Sim Sim Sim Sim Sim Sim
System.Net.Sockets.NetworkStream Não (lança exceção) Não (lança Exceção) Sim Sim Não (lança exceção) Sim
System.Security.Cryptography.CryptoStream Sim Sim Sim Sim Sim Sim

Depois da classe Stream o tipo mais importante é TextReader que é otimizado para ler caracteres de um Stream e fornece um nível de especialização. Diferente de Stream , que fornece acesso aos dados nível de bytes, TextReader fornece um acesso orientado a string com métodos como ReadLine( ) e ReadToEnd( ). A classe TextReader é uma classe abstrata e inclui as subclasses StreamReader e StringReader.

Muitos tipos XML recebem suas entradas de Stream ou de TextReader. Você pode passar nomes de arquivos e URL diretamente para o seus construtores e métodos Load(), porém, as vezes você achara necessário manipular a fonte de dados antes de tratar com o conteúdo XML. Por esta razão vou falar primeiro como tratar do assunto usando Files e Streams antes de partirmos para XML.

Dando uma olhada no Filesystem I/O

A .NET fornece dois tipos que permitem que você trate diretamente com arquivos , são eles : File e FileInfo.

Uma instância FileInfo representa uma arquivo atual e seu metadata;já o objeto File contém somente métodos estáticos usados para manipular arquivos. Desta forma , você precisa instanciar um objeto FileInfo para acessar o conteúdo do arquivos bem como a informação do arquivo, mas, você pode chamar os métodos estáticos de File para acessar arquivos de forma rápida.

Abaixo temos um exemplo que mostra como você pode usar FileInfo para determinar o tamanho de um arquivo e a data de sua última modificação. Note que ambas asa propriedades Length e LastAccessTime são propriedades do objeto FileInfo.

Private fileInfo As FileInfo = New FileInfo("C:\dados\Arquivo.xml")
Private length As Long = fileInfo.Length
Private lastAccessTime As DateTime = fileInfo.LastAccessTime

Nota: Desde que os tipos FileInfo e File estão contidos no namespace System.IO, para compilar a classe contendo o código devemos incluir o namespace usando:  Imports System.IO

Você pode também usar o tipo File para obter a hora do último acesso ao arquivo , mas não pode obter o tamanho desta forma. O método GetLastAccessTime() retorna o ultimo acesso para o nome do arquivo passado, mas, não existe um método GetLenght() equivalente.

Dim lastAccessTime As DateTime =  File.GetLastAccessTime("C:\dados\Arquivo.xml")

Em geral você usa a classe File para :

Você pode usar a classe FileInfo quando você quer abrir um arquivo para leitura e escrita e deseja tratá-lo por um período longo de tempo.

Você pode ler o conteúdo de um arquivo obtendo um FileStream para o mesmo, via método OpenRead() da classe File ou FileInfo. A subclasse FileStream da classe Stream, possui o método Read() que permite ler caracteres de um arquivo para um buffer.

O código abaixo abre um arquivo para leitura e tenta ler até 1024 bytes de dados para um buffer, ecoando o texto para o console:

Dim stream As Stream = File.OpenRead("C:\dados\Arquivo.xml")
Dim bytesToRead As Integer = 1024
Dim bytesRead As Integer = 0

Byte ( ) buffer = New Byte (bytesToRead) {}

' Preenche o buffer até alcancar o fim do arquivo

Do
    bytesRead = stream.Read(buffer, 0, bytesToRead)
    Console.Write(Encoding.ASCII.GetChars(buffer,0, bytesRead))
Loop While bytesToRead = bytesRead

stream.Close()
 

Nota: A classe Enconding esta contida no namespace System.Text e fornece diversos métodos úteis para converter strings para arrays de bytes e arrays de bytes para string.

Outra forma de acessar os dados de um arquivo é usar o TextReader. File.OpenText() retorna uma instância de TextReader, a qual inclui método como Readline(), o qual permite ler um linha inteira de texto de um Stream de uma vez, e ReadToEnd() , o qual permite ler um arquivo inteiro de uma vez.

Dim reader As TextReader = File.OpenText("C:\dados\Arquivo.xml")

' Lê uma linha de cada vez até alcançar o fim do arquivo
While reader.Peek() <> -1
    Dim line As String = reader.ReadLine()
     Console.WriteLine(line)
End While

reader.Close()

O método Peek() lê um único caractere de um Stream sem se mover da posição atual. Peek() é usado para determinar o próximo caractere o qual será lido sem lê-lo, e , retorna -1, se o próximo caractere esta no fim do arquivo. Outros métodos como Read() e ReadBlock() permitem acessar o arquivo em blocos de vários tamanhos, de um único byte até um bloco de tamanho definido pelo usuário.

Voltando ao XML DOM

Quando usamos DOM devemos ter em mente que esta técnica considera qualquer arquivo XML como sendo descrito como uma árvore de Nós.

O XML DOM utiliza o modelo Tree-Based (baseado em árvore) e cria uma estrutura de dados na memória para representar os dados do arquivo XML permitindo acessar de forma aleatória qualquer nó dentro do documento XML.

O XML DOM também representa um modelo de objeto a partir do qual podemos interpretar e criar dados ; como este modelo é um modelo baseado em árvore o modelo DOM vai permitir a nossa aplicação Visual Basic navegar através da árvore com nós representando elementos , atributos , comentários e outras estruturas. Abaixo do nível do nó raiz ( o topo ) temos os nós filhos , parentes e irmãos interligados ou não.

Há duas formas de examinarmos qualquer um dos Nós de um XML DOM. Na realidade todos são Nós , mas , existem tipos específicos de Nós: Nó Elemento e Nó Atributo. Cada tipo de Nó dá suporte a todos os recursos de um Nó genérico. Os tipos de Nós mais  usados são:

Tipo de Nó Descrição
XmlElement Representa um elemento de um arquivo XML
XmlAttribute Representa um atributo de um arquivo XML
XmlDocument Representa o documento com um todo.
XmlComment Representa um comentário de um arquivo XML

A seguir temos os métodos e propriedades comum a todos os Nós XML

Membro Descrição
Attributes Permite a navegação pela lista de atributos em cada nível da hierarquia
ChildNodes Permite percorrer os filhos com um laço For/Next e realizar a navegação pelo DOM
FirstChild Retorna o primeiro Nó filho do nó atual.
Innertext O texto contido no interior de cada Nó
Name O texto dos colchetes de cada Nó
NextSibiling Retorna o próximo Nó possível no mesmo nível do atual
NodeType Retorna o tipo de Nó atual
AppendChild Adiciona um novo filho ao Nó atual

Abaixo os métodos e propriedades de XmlDocument

Membro Descrição
DocumentElement O nó raiz do documento ( propriedade)
CreateNode Cria novos Nós que serão adicionados ao documento
CreateElement É usado para criar novos elementos no documento
CreateAttribute Cria atributos no documento
Load Carrega o conteúdo do arquivo XML em um documento
LoadXml Carrega em um documento o conteúdo de uma string que contém XML
Save Salva o conteúdo do documento XML em um arquivo

Quando você usa XmlDocumento e DOM para ler arquivos XML você pode usar ChildNodes ou FirstChild/NextSibiling para percorrer e encontrar os nós sobre os quais estiver interessado. A utilização da DOM não é recomendada para arquivos grandes.

XML DOM é implementado através da classe XmlNode que é uma classe abstrata que representa um documento XML.

XmlNodelist é uma lista não ordenada de Nós. As duas classes são o núcleo da implementação da XML DOM na plataforma .NET.

A seguir vamos mostrar um exemplo prático usando o XML DOM no VB.NET.

Inicie um novo projeto no VS.NET do tipo Windows Application usando a linguagem VB.NET e no formulário padrão - form1.vb- inclua um componente MainMenu e um componente AxSHdocVw que servirá como container para o Navegador onde iremos exibir os arquivos XML.

Imports usado no projeto:

Imports System.Xml

Os arquivos XML usados estão na pasta bin o projeto cujo caminho é obtido pela definição da linha de código abaixo no evento load do formulário:

arquivoXML = Application.StartupPath + "\Xml.config"

 

Cada opção do Menu realiza uma operação com XML usando DOM. Não vou mostrar todo o código pois o projeto será disponibilizado para download. A primeira opção que cria um tem o seguinte código:

Private Sub MenuItem2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MenuItem2.Click
     'opção 1 do menu cria e salva arquivo XML - testeXML.
        Try
            Dim refXML As Object = Nothing
            'define documento arquivo XML
            Dim xmldocumento As XmlDocument = New XmlDocument
            xmldocumento.LoadXml("<livro categoria='ASP' ISBN='85-85943-96-3'>" + "<titulo>ASP, ADO e Banco de dados na Internete</titulo>" 
+ "</livro>")
            'define o raiz
            Dim root As XmlNode = xmldocumento.DocumentElement
            'define o element
            Dim element As XmlElement = xmldocumento.CreateElement("titulo")
            element.InnerText = "Carregando um arquivo XML com XmlDom"
            root.ReplaceChild(element, root.FirstChild)
            'salva o arquivo XML
            xmldocumento.Save("testeXML.xml")
            Dim xmlFile As String = Application.StartupPath + "\testeXml.xml"
            'exibe o arquivo XML criado no Navegador
            AxWebBrowser1.Navigate(xmlFile, refXML, refXML, refXML, refXML)
            MessageBox.Show(Me, "Arquivo XML criado e salvo com sucesso.", "Info...", MessageBoxButtons.OK, MessageBoxIcon.Information)
        Catch ex As Exception
            MessageBox.Show(ex.ToString)
        End Try

End Sub

 

As demais opções estão no arquivo do projeto.

 

Pegue o projeto e os arquivo usados aqui :  xmlDOM1.zip

 

Em breve continuaremos a tratar deste importante assunto em artigos futuros..

 

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 ?

  Gostou ?   Compartilhe no Facebook   Compartilhe no Twitter

Referências:


José Carlos Macoratti