Visual Basic em Português

Página pessoal de Jorge Paulino sobre o Visual Basic (VB.NET, ASP.NET, VB6, VBA) e algumas noticias de tecnologia

VB.NET: Introdução ao XML

O XML (eXtensible Markup Language) ou linguagem de marcação estendida, é um formatos cada vez mais populares e utilizado por diversos tipos de aplicações. O XML é muito semelhante ao HTML e a principal diferença é que o HTML serve para descrever a aparência e as acções em uma página e o XML serve para guardar dados. Além disso o HTML utiliza tags pré-definidas e o XML não, mas a estrutura é idêntica - as tags (palavras encapsuladas por sinais '<' e '>') e os atributos (definidos com nome="valor").

Existem muitos benefícios na utilização do formato XML, como por exemplo, funcionam sem pré-requisitos, grande capacidade e rapidez de utilização, múltiplas formas de visualizar os dados, fácil distribuição, utilização e compatibilidade com diversos sistemas, etc. Para mais informações podem ler World Wide Web Consortium (W3C)


Existem diversas aplicações e operações bastante fáceis. Pode-se por exemplo gravar todos os dados de uma DataTable para XML e ler os dados para uma DataGridView utlizando poucos comandos:

‘ Grava a informação de uma DataTable para um ficheiro XML
myDataTable.WriteXml("c:\MyData.xml", Data.XmlWriteMode.WriteSchema)

' Lê a informação do ficheiro para uma DataGridView utilizando um DataSet
Dim ds As New DataSet()
ds.ReadXml("c:\MyData.xml")

Me.DataGridView1.DataSource = ds.Tables("MyTable") 

Tão simples como isto!  

Mas o objectivo deste artigo é mostrar como criar um ficheiro simples de XML (para guardar configurações), inserir, listar e apagar elementos. Para criar um ficheiro XML usa-se a XmlTextWriter do namespace System.Xml

     Imports System.Xml

     Private xmlPath As String = "C:\MyData.xml"

    ' Cria um novo ficheiro XML através do clique de um botão
    Private Sub btnCriarXML_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnCriarXML.Click

        ' Cria um novo ficheiro XML com a codificação UTF8
        Dim xmlw As New XmlTextWriter(xmlPath, System.Text.Encoding.UTF8)
        xmlw.Formatting = Formatting.Indented

        xmlw.WriteStartDocument()

        ' Adiciona um comentário geral
        xmlw.WriteComment("Configuração Geral")

        ' Criar um elemento geral
        xmlw.WriteStartElement("config")

        ' Criar o elemento "Favoritos" e alguns dados
        With xmlw
            .WriteStartElement("favoritos")
            .WriteElementString("fav", http://vbtuga.blogspot.com)
            .WriteElementString("fav", http://www.microsoft.com)
            .WriteElementString("fav", http://www.google.com)
            .WriteElementString("fav", http://www.asp.net)
            .WriteEndElement()
        End With

        ' Criar o elemento "Utilizadores" e alguns dados
        With xmlw
            .WriteStartElement("utilizadores")
            .WriteElementString("user", "Jorge Paulino")
            .WriteElementString("user", "João Costa")
            .WriteElementString("user", "Nuno Andrade")
            .WriteEndElement()
        End With

        xmlw.WriteEndElement() ' <- config
        xmlw.WriteEndDocument()

        ' Fecha o documento XML
        xmlw.Flush()
        xmlw.Close() 

    End Sub


O resultado final deverá ser um ficheiro com este:

<?xml version="1.0" encoding="utf-8" ?>
<!-- Configuração Geral>
<config>
    <favoritos>
        <fav>http://vbtuga.blogspot.com</fav>
        <fav>http://www.microsoft.com</fav>
        <fav>http://www.google.com</fav>
        <fav>http://www.asp.net</fav>
    </favoritos>
    <utilizadores>
        <user>Jorge Paulino</user>
        <user>João Costa</user>
        <user>Nuno Andrade</user>
    </utilizadores>
</config>


Com podem ver este ficheiro tem dois “grupos”: Favoritos e Utilizadores. Esses grupos são onde se guarda informação com as suas respectivas tags. Para ler um desses grupos e listar os dados em uma ListBox é apenas necessário:

        ' Cria um novo documento XML e lê o ficheiro criado anteriormente
        Dim xmlDoc As New XmlDocument
        xmlDoc.Load(xmlPath) 

        ' Selecciona os “favoritos” e faz um ciclo em todos 
        ' nodes preenchendo a ListBox1
        Dim node As XmlNode = xmlDoc.SelectSingleNode("//favoritos")
        If node IsNot Nothing Then
            For x As Integer = 0 To nodeA.ChildNodes.Count – 1
                Me.ListBox1.Items.Add(node.ChildNodes.Item(x).InnerText.ToString)
            Next
        End If 


Para apagar e inserir novos dados criei duas funções auxiliares. Estas funções servem para reduzir código e simplificar este processo.

    ''' <summary>
    ''' Remove um node de um ficheiro XML retornando
    ''' como resultado 'True' caso tenha conseguido
    ''' </summary>
    ''' <param name="nodeGroup">Nome do Grupo</param>
    ''' <param name="nodeText">Texto a Remover</param>
    Private Function RemoveXMLNode(ByVal nodeGroup As String, ByVal nodeText As String) As Boolean

        Dim result As Boolean = False

        Try

            ' Verifica se o ficheiro existe
            If Not IO.File.Exists(xmlPath) Then
                Return False
            End If

            ' Cria um novo XmlDocument e carrega o ficheiro XML
            Dim xmlDoc As New XmlDocument
            xmlDoc.Load(xmlPath)

            ' Selecciona o grupo escolhido
            Dim node As XmlNode = xmlDoc.SelectSingleNode("//" + nodeGroup)

            ' Apaga todos os nodes (caso encontre na lista)
            For x As Int16 = node.ChildNodes.Count - 1 To 0 Step -1

                If node.ChildNodes.Item(x).InnerText.ToString = nodeText Then
                    node.RemoveChild(node.ChildNodes.Item(x))
                    result = True
                End If

            Next

            ' Caso tenha eliminado o(s) node(s) grava o ficheiro
            If result = True Then
                xmlDoc.Save(xmlPath)
                Return True
            Else
                Return False
            End If

        Catch ex As Exception
            ' Em caso de erro retorna False
            Return False
        End Try 

    End Function

 

    ''' <summary>
    ''' Adiciona um node de um ficheiro XML retornando
    ''' como resultado 'True' caso tenha conseguido
    ''' </summary>
    ''' <param name="nodeGroup">Nome do Grupo</param>
    ''' <param name="nodeName">Nome que fica na tag</param>
    ''' <param name="nodeText">Texto a Inserir</param>
    Private Function AddXMLNode(ByVal nodeGroup As String, ByVal nodeName As String, ByVal nodeText As String) As Boolean

        Dim result As Boolean = False

        Try

            ' Verifica se o ficheiro existe
            If Not IO.File.Exists(xmlPath) Then
                Return False
            End If

            ' Cria um novo XmlDocument e carrega o ficheiro XML
            Dim xmlDoc As New XmlDocument
            xmlDoc.Load(xmlPath)

            ' Selecciona o grupo escolhido
            Dim node As XmlNode = xmlDoc.SelectSingleNode("//" + nodeGroup)

            ' Cria um novo elemento e define o texto
            Dim newNode As XmlNode = xmlDoc.CreateElement(nodeName)
            newNode.InnerText = nodeText

            ' Insere o novo XmlNode
            node.AppendChild(newNode)

            ' Grava as alterações
            xmlDoc.Save(xmlPath)
            Return True

        Catch ex As Exception
            ' Em caso de erro retorna False
            Return False
        End Try

End Function

Para utilizar estas funções e manipular o ficheiro XML é só necessário:

' Adicionar informação
Dim result As Boolean = AddXMLNode("utilizadores", "user", "Ana Dias")
If result Then
       Debug.WriteLine("Ficheiro XML actualizado ...")
End If

' Remover informação
Dim result As Boolean = RemoveXMLNode("favoritos", http://www.google.com)
If result Then
       Debug.WriteLine("Ficheiro XML actualizado ...")
End If

Estes são apenas alguns exemplos de como utilizar um ficheiro XML para guardar informação. Neste caso foi utilizado uma estrutura muito simples, podendo-se no entanto criar um ficheiro mais complexo com a utilização de atributos, mais tags, etc.  

O objectivo deste artigo e mostrar que é simples e prático guardar informação, podendo ser utilizado em inúmeras situações como guardar definições, fazer backups de bases de dados, copiar dados, etc.

PS: Como sempre, qualquer dúvida, comentário ou correcção ao artigo é sempre bem vinda!

6 comentários:

Anónimo disse...

Olá amigo, estou substuindo em meus sistemas o .ini pelo .xml e tenho uma dúvida. Para as configurações do meu software eu crio só um elemento ou um elemento para cada ítem a ser configurado. Por exemplo: Caminho da base dados, Local do backup, etc.

Obrigado.

Att.
Fabiano Nalin
nalin@uol.com.br

Jorge Paulino disse...

Olá,

Tem de criar um elemento para cada item a ser configurado. Pode no entanto utilizar, caso utilize .NET Framework 3.5 ou superior, XML Literals, que simplifica bastante o processo.

Encontra alguns exemplos no blog ;)

José Roberto Siqueira disse...

Saudações Jorge Paulino

Segui seus tutoriais e consegui aplicá-los perfeitamente, porém, encontro certa dificuldade neste tipo de XML:


2
SP_NFE_PL_006h
103
Lote recebido com sucesso
35
2011-02-11T14:49:47

351000030132241
1



Seguindo seu exemplo de ler com For/Next não consigo localizar . Ele lê o nó principal e depois sai do laço.

Será que pode ajudar-me com esta dúvida, por favor?

Agradeço qualquer ajuda.

José Roberto Siqueira disse...

Não sei o que ocorreu foi apenas o resultado do XML e não a estrutura dele. Bom, deve ser algo com o Blogger mais se precisar eu envio por email, é um arquivo muito pequeno com 12 linhas.

Jorge Paulino disse...

O problema é que são identificadas como tags ;)

Se puder coloque a questão no fórum onde sou moderador (preferencialmente) ou então envie-me o ficheiro.

rodolfo rej disse...

Se eu precisar pegar esses dados de um banco de dados em access, como ficaria?

Mensagens Recentes



Microsoft Office Especialist

Membro da Comunidade
Experts-Exchange


Administ. da Comunidade
Portugal-a-Programar



Twitter

Artigos no CodeProject

Artigos no CodeProject

Subscrever Novidades

Endereço de Email:

Delivered by FeedBurner

Seguidores

Histórico