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.Indentedxmlw.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 Withxmlw.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 BooleanDim 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 -1If node.ChildNodes.Item(x).InnerText.ToString = nodeText Then
node.RemoveChild(node.ChildNodes.Item(x))
result = True
End IfNext
' Caso tenha eliminado o(s) node(s) grava o ficheiro
If result = True Then
xmlDoc.Save(xmlPath)
Return True
Else
Return False
End IfCatch ex As Exception
' Em caso de erro retorna False
Return False
End TryEnd 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 BooleanDim 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 TrueCatch ex As Exception
' Em caso de erro retorna False
Return False
End TryEnd 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:
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
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 ;)
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.
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.
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.
Se eu precisar pegar esses dados de um banco de dados em access, como ficaria?
Enviar um comentário