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.
4 comentários:
Por favor, onde consigo as units :
DOM,XMLRead e XMLWrite ?
Obs.: Trabalho com Delphi 7
Desde já agradeço,
Edson Clemente
No Delphi tem um componente que faz tudo isso, o XMLDocument. Fica na paleta de componentes Internet. Veja ai se consegue e qualquer dúvida me escreva.
Professor, eu já incluir o componente XMLDocument,pois somente as units:
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
Pra ler use o método LoadFromFile() e pra salvar use SaveToFile(). Ambos são do componente. XMLRead e XMLWrite são apenas do lazarus. Lazarus ainda não tem um componente como Delphi,por isso implementa através dessas três units.
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
Postar um comentário