Sabemos que um documento XML pode ser criado manipulando strings e arquivos texto. Esta opção não é aconselhável, pois é difícil garantir que o documento seja bem formado. A melhor forma de fazer isso é usar DOM (Modelo Objeto de Documento). Já usamos esse padrão para ler um documento XML no artigo anterior.
Para ilustrar a criação de um documento vamos implementar uma aplicação que gera um XML a partir dos registros de um
DataSet. Para isso vamos usar nosso banco de dados
SQLite de exemplos anteriores e vamos usar
ZeosLib. Mas pode ser usado qualquer conjunto de componentes, inclusive
SQLdb.
Coloque então um
TZConnection no form, ou num
Data Module. Defina a propriedade
Database com o banco SQLite, ou qualquer outro. Defina a propriedade
Protocol com
sqlite-3.
Coloque também um
TZReadOnlyQuery e defina
Name como
queCidade. Em
Connection selecione o
TZConnection. Na propriedade
SQL digite
SELECT * FROM CIDADE.
Insira um botão, que vai executar a criação do XML.
Na cláusula uses acrescente as units
DOM e
XMLWrite.
Agora vamos criar o código que efetivamente irá criar o XML. A idéia é criar um procedimento genérico, que servirá para qualquer tabela.
O procedimento
Tabela2DOM() recebe como argumentos o nome do nó raiz, o nome do nó pai, o próprio documento XML e o
DataSet. Observe o código abaixo:
procedure TfrmDataXml.Tabela2DOM(Raiz, Registro: string; XMLDoc: TXmlDocument; DataSet: TDataSet);
var
iRaiz, iPai, iFilho: TDOMNode;
i, j: Integer;
begin
DataSet.Open;
DataSet.First;
iRaiz := XMLDoc.CreateElement(Raiz);
XMLDoc.AppendChild(iRaiz);
j := 0;
while not DataSet.EOF do
begin
iRaiz := XMLDoc.DocumentElement;
iPai := XMLDoc.CreateElement(Registro);
iRaiz.AppendChild(iPai);
for I := 0 to DataSet.FieldCount - 1 do
begin
if not (DataSet.Fields[i].IsNull) then
begin
iPai := XMLDoc.CreateElement(DataSet.Fields[i].FieldName);
iFilho := XMLDoc.CreateTextNode(DataSet.Fields[i].AsString);
iPai.AppendChild(iFilho);
iRaiz.ChildNodes.Item[j].AppendChild(iPai);
end;
end;
DataSet.Next;
j := j + 1;
end;
DataSet.Close;
end;
Nas linhas 8 e 9 criamos o nó raiz e o adicionamos ao documento. O método
AppendChild() adiciona um nó ao documento.
A partir da linha 11 iniciamos a varredura da tabela. Para cada registro da tabela adicionamos um nó pai com o nome passado como parâmetro, que é feito nas linhas 14 e 15.
O for da linha 16 irá precorrer os campos de cada registro da tabela. Para cada registro criamos um nó pai com o nome do campo (linha 20) e um nó filho com o conteúdo do campo. A linha 18 evita a inclusão de campos vazios no documento.
No evento
OnClick do botão criamos o objeto DOM, o procedimento acima é chamado, o documento é gravado usando o método
writeXMLFile() e o objeto é destruido.
procedure TfrmDataXml.btnCriarClick(Sender: TObject);
begin
XMLDoc := TXMLDocument.Create;
Tabela2DOM ('cidades', 'cidade', XMLDoc, queCidade);
writeXMLFile(XMLDoc,'cidade.xml');
XMLdoc.free;
end;
Para executar lembre de conectar o banco e abrir a tabela, conforme visto em artigos anteriores.
Baixe
aqui o código completo do exemplo.
Comentários
DOM,XMLRead e XMLWrite ?
Obs.: Trabalho com Delphi 7
Desde já agradeço,
Edson Clemente
xmldom, XMLIntf, msxmldom, XMLDoc foram acrescentadas no uses, as units DOM e XMLRead e XMLWrite não foram, pois na chama da procedure ReadXMLFile, do seu exemplo, o delphi não as reconhcece.
Agradeço muito a atenção,
Edson Clemente
Não tente fazer em Delphi usando o código do meu artigo. Existem algumas diferenças. Veja esse artigo aqui:
http://www.caiooliveira.com.br/?p=73