CAPÍTULO 7
Programação visual com Software Livre
EDIT LIN EDITORIAL S.L,  dos autores  Daniel Campos Fernández e José Luis Redrejo.  Prólogo de Benoit Minisini


Próximo >>

7.1 Escrevendo com XmlWriter


A classe XmlWriter, contida dentro do componente gb.xml, utiliza um modo simples para escrever um documento XML. Suponhamos que desejemos armazenar em um programa os dados relativos a várias ligações telefônicas a internet. Nos interessará o nome da conexão, o telefone e o DNS, primário e secundário, utilizados pelo provedor.

Vejamos um documento no qual teremos uma seção conexao para cada conexão, terá um atributo mome e outro local, este último com dois valores: 1 se for local e 0 se for nacional. Dentro da seção conexao haverá um campo para armazenar o número do telefone, assim como outro para os DNS primário e secundário, os quais terá um atributo que determine se é o primário.

 
Sempre é conveniente empregar nomes de tags que não contenham acentos ou caracteres especiais de cada idioma (como ã ou ç), para evitar problemas se outros programadores que devam retocar o programa ou o arquivo tenham teclados diferentes ou empregam parsers de XML pobres que ignorem alguns aspectos da codificação.

Este será o aspecto do arquivo XML do exemplo:
 

<?xml version="1.0"?>

<conexoes version="1.0">

<conexao id="castuonet" local="0">

<telefone>1199212321</telefone>

<dns primario="1">127.0.0.2</dns>

<dns primario="0">127.0.0.3</dns>

</conexao>

<conexao id="limbonet" local="0">

<telefone>229943484</telefone>

<dns primario="1">127.0.10.10</dns>

<dns primario="0">127.0.20.42</dns>

</conexao>

</conexoes>
 

Antes de continuar, observemos o formato. Está separado em várias linhas, o retorno do carro, e existe uma identificação para indicar os diversos níveis de a aninhamento. Isto não é em absoluto necessário, e os parsers de XML ignoram os espaços em branco e tabulações, assim como os retornos do carro. Isso é só uma ajuda para quem tem que consultar ou modificar o arquivo a partir de um editor de texto comum. Só tem, portanto, sentido a nível humano, e um arquivo XML correto poderia está contido em uma só linha de texto. Se estivermos acostumado a programar em C ou C++, sabemos que com esta linguagem ocorre o mesmo: as diferentes linhas e tabulações dão ordem e legibilidade ao programa, mas o mesmo poderia escrever-se em uma só linha. Em C, as chaves, pontos e aspas são significativas, não é assim com os espaços e retorno do carro. Em XML o significativo são as aberturas e fechamento das tags.
 
A seguir vamos criar um programa de console chamado EscreveXML, e dentro dele um único módulo ModMain com uma função Main.

O programa terá uma referência ao componente gb.xml.

Definimos e criamos um objeto XmlWriter. Após isto, o abrimos com Open para começar a escrita. Este método aceita três parâmetros: o primeiro, obrigatório, é o nome do arquivo a escrever, que pode ser um local  dentro  do
Figura 1
Figura 1.Projeto EscreveXML.
 

sistema de arquivos ou uma cadeia em branco, em cujo caso se escreverá na memória, logo poderemos obtê-lo como uma cadeia para, por exemplo, enviar pela rede a um equipamento remoto. O segundo é opcional, i indica que desejamos que tenha identificação (como se comentou antes, para aumentar sua legibilidade), ou melhor, se escrevermos em uma só linha para economizar  espaço, o  tornamos ilegível a partir de um  editor não especializado. O terceiro, também opcional, serve para, se desejarmos, especificar a codificação, diferente de UTF-8
 

' Gambas module file

PUBLIC SUB Main()

DIM Xml AS XmlWriter

Xml = NEW XmlWriter

Xml.OPEN ("", TRUE)

END
 
Indicar uma codificação diferente serve para que esta fique exposta no inicio do documento, mas não realizará para nós a conversão das cadeias que escrevemos, tarefa que teremos que fazer com funções como Conv$, se desejarmos.

Xml.StartElement ( conexoes )
 

Escrevendo a primeira seção. Temos de introduzir uma tag de abertura, tarefa que será realizada com o método StartElement:
 

Xml.Attribute ( "versão", "1.0" )
 

Alem disso dispomos de um atributo "version" com valor "1.0":

Neste caso também podemos unir as duas instruções anteriores em uma só:
StartElemente aceita um parâmetro opcional, consistente em uma matriz de cadeia que sejam pares de valores atributo-valor do atributo:
 

Xml.StartElemente ( "conexoes",  [ "version", "1.0" ] )


Dentro desta sessão temos cada uma das conexão definidas. Começamos pela primeira que, é igual a anterior, uma tag de captura, com um nome e dois atributos, neste caso:
 

Xml.StartElemente ( "conexoes",  [ "id", "castuonet", "local",   "0" ] )
 

Dentro desta região, dispomos de uma nova abertura de tag para o telefone:
 

Xml.StartElemente ( "telefone" )
 

Contem um texto que compreende o número do telefone:
 

Xml.StartElemente ( "1199212321" )
 

Após este passo encerramos a tag:
 

Xml.EndElemente ( )
 

No entanto, podemos resumir as três instruções anteriores em uma só, válidas para estes elementos simples que tão só contem um texto dentro (ou nada) e logo se encerra.
 

Xml.Elemente ( "telefone", "1199212321" )
 

Para o DNS iniciamos uma tag "dns" com um atributo:
 

Xml.StartElemente ( "dns",  [ "primario", "1" ] )
 

Incluimos um texto com o IP:
 

Xml.text ( "127.0.0.2" )
 

E finalizamos a seção:
 

Xml.EndElemente ( )
 

O mesmo para o segundo DNS:
 

Xml.StartElemente ( "dns",  [ "primario" "0" ] )

Xml.text ( "127.0.0.2" )

Xml.EndElemente ( )
 

Finalmente  encerramos  a tag "conexao" que contem  os elementos  anteriores  relativo a essa conexão:
 

Xml.EndElemente ( )

Procedemos de igual maneira para a segunda conexão, e como podemos observar no seguinte código:

Xml.StartElement ( "conexao",  [ "id", "limbonet", "local""1" ] )

Xml.Element ( "telefone""229943484" )

Xml.Startelement ( "dns", [ "primario""1" ] )

Xml.text ( "127.0.10.10" )

Xml.EndElement ( )

Xml.Startelement ( "dns",  [ "primario", "0" ] )

Xml.text ( "127.0.20.42" )

Xml.EndElement ( )

Xml.EndElement ( )
 

Finalmente encerramos o documento para que se escreva. Se não especificamos o nome do arquivo, é o momento de fazer isso, em nosso caso, em memória.

A chamada a EndDocumento nos devolve uma cadeia com o documento XML, que o mostramos no console.
 

PRINT Xml.EndDocumento ( )
 

O programa completo fica da seguinte maneira:

' Gambas module file

PUBLIC SUB Main()

DIM Xml AS XmlWriter


Xml = NEW XmlWriter

Xml.Open ( ""TRUE )


Xml.StartElement ("conexoes", ["versao", "1.0"] )

Xml.StartElement ("conexao", ["id", "castuonet", "local", "0"] )

Xml.Element ( "telefone", "1199212321" )

Xml.StartElement ( "dns", ["primario", "1"] )

Xml.Text ("127.0.0.2")

Xml.EndElement()

Xml.StartElement ( "dns", ["primario", "0"] )

Xml.Text ( "127.0.0.3" )

Xml.EndElement ()

Xml.EndElement ()


Xml.StartElement ("conexao", ["id", "limbonet", "local", "1" ] )

Xml.Element ("telefone", "229943484")

Xml.StartElement ("dns", ["primario", "1"])

Xml.Text ("127.0.10.10")

Xml.EndElement ()

Xml.StartElement ("dns", ["primario", "0"])

Xml.Text ("127.0.20.42")

Xml.EndElement ()

Xml.EndElement ()


PRINT Xml.EndDocument()


END
 

Ao executa-lo, veremos o documento no console. O modificamos para que escreva em um arquivo em lugar do console, o qual nos servirá para lê-lo em um futuro exemplo de leitura de arquivo XML. Para isso modificaremos o método Open:
 

Xml.Open ( User.Home & "/conexoes.xml" , TRUE )

eliminaremos a instrução PRINT no final:
 

Xml.EndDocument ( )

neste caso a chamada ao metodo EndDocument criará o documento em um arquivo dentro de nossa pasta pessoal, chamado conexao.xml.
 
O arquivo aberto com Open não é gravado realmente do disco rígido até a chamada a EndDocument. Por sua vez, o método Enddocument se encarrega de fechar todas as tags que estiverem abertas, para garantir a coerência XML deste.

Exploremos a classe XmlWriter, observaremos que, alem dos métodos comentados, existe outros para escrever comentários e elementos correspondente a DTD, entre outras características. Também dispomos dos métodos práticos Base64 e BinHex, que converte uma cadeia para codificações com este nome. Essas codificações permitem introduzir dados binários dentro de um arquivo XML.







 
 

Próximo >>

HOME



Cópia literal

Extraído do livro “GAMBAS, programação visual com software Livre”, da editora EDIT LIN EDITORIAL S.L,  dos autores  Daniel Campos Fernández e José Luis Redrejo. Prólogo de Benoit Minisini

LICENSA DESTE DOCUMENTO


É permitido a cópia e distribuição da totalidade ou parte desta obra sem fins lucrativo. Toda cópia total ou parcial devera expressar o nome do autor e da editora e incluir esta mesma licença, adicionando se é uma cópia literal “Cópia literal”. Se é autorizada a modificação e tradução da obra  sem fins lucrativo sempre se deve constar na obra resultante  a modificação o nome da obra original o autor da obra original e o nome da editora e a obra resultante também deverá ser livremente reproduzida, distribuída, ao publico e transformada em termos similares ao exposto nesta licença.

Tradução

Cientista
 (Antonio Sousa)