VB: Usando XML para pequenas base de dados
Desenvolvimento - XML
VB: Usando XML para pequenas base de dadosÉ inquestionável a importância dos bancos de dados de alto desempenho como os SQLs, ORACLE e até mesmo o ACCESS no desenvolvimento de aplicativos, mas há alguns momentos em que o uso de ferramentas tão sofisticadas parece não ter sentido.por Marco Aurélio Barbiero
É inquestionável a importância dos bancos de dados de alto desempenho como os SQLs, ORACLE
e até mesmo o ACCESS no desenvolvimento de aplicativos, mas há alguns momentos em que o uso
de ferramentas tão sofisticadas parece não ter sentido.
Um caso emblemático foi o de um aplicativo para impressão de envelopes que avaliei e que tinha
como única tarefa armazenar meia dúzia de endereços e depois imprimi-los em envelopes. O
desenvolvedor agregou bases ACCESS e objetos para gerenciar estas bases que acabaram
produzindo um instalador de 6 MB. A mesma aplicação usando base de dados em XML ficou muito
mais simples e legível.
De qualquer forma, independente da utilidade, o assunto é muito interessante, especialmente para
"fuçadores".
Neste arquivo, essencialmente prático, vamos desenvolver algumas rotinas para utilizar arquivos
XML em substituição aos clássicos arquivos ".INI": basicamente ler e gravar informações de
No VB6 que uso para desenvolver é necessário um passo preliminar para agregar suporte ao XML:
Eu usei a versão 3.0 do Microsoft XML, mas acredito que a versão 2.0 já seja suficiente.
Inicialmente o arquivo XML pode ser simples, contendo apenas configurações em nós filhos do nóraiz:
É possível criar diferentes seções para Impressão, Cores, Margens, etc, mas não vamos fazer isso
Nossa primeira tarefa é muito simples: carregar o arquivo XML no objeto objDOC ou criar o
arquivo, se não existir.
Private Sub AbreDocXML(nmArquivo)
"  Se arquivo não existe, cria; caso contrário, carrega o XML
If Not objDoc.Load(Environ("CommonProgramFiles") & "\" & nmArquivo) Then
Set NodeCONFIG = objDoc.createNode(NODE_ELEMENT, "CONFIG", "")
objDoc.appendChild objXMLDomNode
objDoc.save (Environ("CommonProgramFiles") & "\" & nmArquivo)
Set NodeCONFIG = objDoc.documentElement
O objeto "objDoc" é a base de qualquer aplicativo que use XML e DOM: os nós filhos são criados usando este objeto e depois anexados ao nível hierárquico desejado.
A procedure "AbreDocXML" tenta abrir o arquivo nmArquivo e carregar seu conteúdo no " objDOC" . Diante da impossibilidade de carregar os dados, um nó é criado com o nome " nodeCONFIG" . Este nó será o nó raiz do documento XML. O nodeCONFIG é anexado ao objDOC e o arquivo é salvo na pasta especificada, geralmente "Arquivos de Programas".
Se o arquivo for localizado e não houver erro na carga o objeto nodeCONFIG é definido como nó raiz pela instrução " set nodeCONFIG = objDOC.documentElement" .
Embora seja possível trabalhar com o nó raiz usando uma referência a " objDOC.documentElement" a definição de um objeto com o nome da TAG do nó raiz melhora muito a legibilidade.
Obs. é meu costume criar objetos para os níveis hierárquicos mais próximos da raiz e nomeá-los com o nome da TAG. Adicionalmente, crio um objeto genérico (objXML) para as operações de recuperação e gravação de dados.
A instrução " objDoc.save ..." grava o documento em um arquivo.
Uma vez carregado ou criado o arquivo, o trabalho de definição ou recuperação dos valores será feito pelas funções " defineConfig" e " obtemConfig" . As duas funções recebem como parâmetros o nome do arquivo e da TAG a ser definida ou recuperada. No caso de " defineConfig" deve ser passado, também, o novo valor para o parâmetro. Começando com "defineConfig"
Public Sub defineConfig(nmArquivo, parametro, valor)
AbreDocXML (nmArquivo)
Set nodeXML = NodeCONFIG.selectSingleNode(parametro)
"  Se o parâmetro não existe ele é criado, caso contrário apenas define o valor
If nodeXML Is Nothing Then
Set nodeXML = objDoc.createNode(NODE_ELEMENT, parametro, "")
NodeCONFIG.appendChild nodeXML
nodeXML.Text = valor
"  Grava o documento XML
"  Limpando a área
Set NodeCONFIG = Nothing
Set nodeXML = Nothing
As primeiras linhas se encarregam de abrir o arquivo e definir o elemento raiz (documentElement) que passa a ser referenciado como " nodeConfig" . O método " selectSingleNode" retorna um único nó a partir do parâmetro. No nosso caso, como temos apenas dois níveis hierárquicos, este parâmetro é muito simples, resumindo-se ao nome da TAG. É possível usar " selectSingleNode" para selecionar nós em uma hierarquia complexa usando todo o caminho (" impressora/margens/direita" ) ou a partir de valores das TAGs ou atributos. Se a TAG não existir ela é criada e anexada ao nó-raiz.
Obs: Lembre-se que em XML maiúsculas e minúsculas são diferentes.
O atributo " Text" é definido com o valor passado para a função. Os dados são gravados no arquivo e os objetos eliminados.
A função obtemConfig
Public Function obtemConfig(nmArquivo, parametro)
Set nodeXML = NodeRaiz.selectSingleNode(parametro)
"  Se o parâmetro não existe retorna vazio, caso contrário retorna o valor
obtemConfig = ""
obtemConfig = nodeXML.Text
Esta função é ainda mais simples que " defineConfig" , limita-se a verificar a existência de um
parâmetro e retornar o valor definido na TAG. Como não é uma aplicação crítica, no caso de não
encontrar o caminho a função simplesmente retorna um valor vazio.
Para testar as funções eu criei um forma com duas caixas de texto (" txtParametro" e " txtValor" ) e
dois botões (" cmdDefine" e " cmdObtem" ).
Apesar de sua simplicidade, acredito que este artigo será de grande valor para os iniciantes,
principalmente para aqueles que gostam de ver os resultados práticos desde o início. Nos próximos
artigos vamos criar bases de dados mais complexas.
Marco Aurélio Barbiero
Leia tambémUtilizando XML para Solicitação e RespostasXMLResoucer em programas com PE. ExploreXMLJQuery com RichFacesJavaUsando arquivos XML no formato simplesXMLUsando o Boost/C++ para fazer parser de XMLXML