May 29 2007
Utilizando XPath no Delphi
Se você ainda utiliza o bom e velho Delphi 6 deve saber o quanto é complicado encontrar e utilizar certas APIs para trabalhar com tecnologias relativamente novas.
Não que XPath ou XML sejam algo novo, mas que não é comum um desenvolvedor Delphi 4, 5 ou 6 utilizar estas tecnologias, isto é fato!
Nos últimos dias estou trabalhando em um novo projeto que armazenará todas as configurações utilizando um arquivo XML. Se fosse em .NET poderia escolher até mesmo o db4o pra isso, mas em Delphi as únicas possibilidades são o bom e velho arquivo INI ou, com a maior paciência do mundo, arquivos XML.
Como bom metido que sou, resolvi utilizar os XMLs. Já tinha uma noção básica de como utilizá-los, mas desta vez eu precisei de um recurso extra: o XPath.
Mas que diabos é esse XPath?
É uma linguagem de acesso às informações contidas em um arquivo XML. Tome como base o seguinte arquivo:

Para acessar o valor do nodo login que está dentro do bancodados, basta utilizar a seguinte expressão XPath:
/configs/bancodados/login
Entendeu? É quase igual ao acesso de um arquivo dentro de pastas e subpastas.
XPath no Delphi
A unit que dá suporte às expressões XPath no Delphi é a XMLDom. Nela você encontrará a classe IDOMNodeSelect, que provê o método selectNode.
Para ler o valor de um nodo utilizando este método use o código apresentado abaixo:

FXMLDoc é um objeto do tipo IXMLDocument que está declarado como private e foi instanciado previamente. FNodoRaiz é o nodo root do arquivo XML. No exemplo acima, este nodo é o configs.
Veja que o resultado do selectNode não possui diretamente o valor do nodo. Ao invés disso, usa-se a propriedade childNodes.item[0].nodeValue. Levei algumas horas até descobrir isso.
Para a alteração do valor de um nodo o método é semelhante ao apresentado acima. Veja:

A única diferença é que se encontrou o nodo então altera o valor ao invés de retorná-lo.
Existe um detalhe muito importante que os métodos acima não tratam. Caso um dos nodos referenciados na expressão XPath não exista, então o selectNode retornará nil. No caso do método RetornaValor isto não é um problema tão sério, pois simplesmente retornará vazio. No entanto no AlteraValor o comportamento mais óbio possível seria a auto-criação dos nodos não existentes. Para tal, você pode utilizar a rotina abaixo:

Este método cria todos os nodos não encontrados numa expressão XPath. Pode ser chamado dentro da AlteraValor da seguinte forma:

Todas estas rotinas estão disponíveis dentro de uma classe base de acesso a arquivos XML. O download dela pode ser feito aqui.
É isso ae. Até +.







