Social Icons

domingo, 22 de julho de 2012

Manipulação de XML com TXMLDocument – Parte 3

Nos artigos anteriores aprendemos a trabalhar com XML, tanto para criar como para ler um XML usando o componente TXMLDocument. Com o que aprendemos até agora já conseguimos fazer o básico.

Agora abordarei alguns pontos que não mostrei na parte 1 e parte 2 dessa série de artigos sobre XML.

Usaremos o mesmo XML dos artigos anteriores, mas com algumas pequenas modificações.

 <atualizacao>
  <executaveis>
    <executavel versao="1.0.3.22">Módulo gerencial</executavel>
    <executavel versao="1.0.3.123">Configurações da Aplicação</executavel>
  </executaveis>
  <bibliotecas>
    <biblioteca versao="2.0.0.1">Biblioteca de funções</biblioteca>
    <biblioteca versao="1.2.0.4">Biblioteca com rotinas de negócio da aplicação</biblioteca>
  </bibliotecas>
  <observacoes><![CDATA[Nesta parte pode ser escrito um texto muito longo que possua quebras de linhas, caracteres especiais, incluindo "<" e ">", ou até gravar textos de outro arquivo XML, HTML ou RTF.
O CData é como se fosse um Blog no XML]]></observacoes>
</atualizacao>

Neste XML não colocaremos a descrição do executável e da biblioteca em um atributo chamado “descrição” <executavel descricao=”Descrição do módulo”> e sim em um texto para o nó <executavel>Descrição do módulo</executavel>. Também incluímos no XML o nó “observacoes”, ele tem o objetivo de guardar um texto grande com quebras de linhas, acentos e caracteres especiais, para isso foi criado dentro do nó “observacoes” um nó <![CData[Texto grande]]>. Vejamos então como fazer isso via programação.


Crie uma nova aplicação no delphi e coloque no formulário dois TMemos e dois TButtons e um TXMLDocument.


tela4


No evento onClick de um dos botões coloque o seguinte código:

procedure TForm1.Button1Click(Sender: TObject);
var
atualizacao :IXMLNode;
executaveis :IXMLNode;
executavel :IXMLNode;
bibliotecas :IXMLNode;
biblioteca :IXMLNode;
observacoes :IXMLNode;

dadosObservacoes :IDOMCDATASection;

begin
//Formata automaticamente o XML para que a visualização no TMemmo fique
// mais amigável
XMLDocument1.Options := XMLDocument1.Options + [doNodeAutoIndent];

//Ativa o componente TXMLDocument
XMLDocument1.Active := true;

//Cria o nó principal do xml
atualizacao := XMLDocument1.AddChild('atualizacao');

//Cria o nó dos executaveis dentro do nó principal
executaveis := atualizacao.AddChild('executaveis');

//Adiciona um executavel ao nó de executaveis
executavel := executaveis.AddChild('executavel');
executavel.SetAttributeNS('versao','','1.0.3.22');

//Observe que não criamos um atributo "descricao" para o nó executável como
// o atributo "versão", mas adicionamos a descrição do executável direto para
//o texto do nó.
executavel.Text := 'Módulo gerencial';

//Adiciona um executavel ao nó de executaveis
executavel := executaveis.AddChild('executavel');
executavel.SetAttributeNS('versao','','1.0.3.123');
executavel.Text := 'Configurações da Aplicação';

//Cria o nó de bibliotecas dentro do nó principal
bibliotecas := atualizacao.AddChild('bibliotecas');

//Adiciona uma biblioteca ao nó de biblioteca
biblioteca := bibliotecas.AddChild('biblioteca');
biblioteca.SetAttributeNS('versao','','2.0.0.1');
biblioteca.Text := 'Biblioteca de funções';

//Adiciona uma biblioteca ao nó de biblioteca
biblioteca := bibliotecas.AddChild('biblioteca');
biblioteca.SetAttributeNS('versao','','1.2.0.4');
biblioteca.Text := 'Biblioteca com rotinas de negócio da aplicação';

observacoes := atualizacao.AddChild('observacoes');

//Cria um Blob de observações no
dadosObservacoes := XMLDocument1.DOMDocument.createCDATASection('Nesta parte pode '+
'ser escrito um texto muito longo que possua quebras de linhas, caracteres '+
'especiais, incluindo "<" e ">", ou até gravar textos de outro arquivo XML, HTML ou RTF.'+
sLineBreak+
'O CData é como se fosse um Blog no XML');

//Adicionamos um novo nó em nosso XML onde ele possuirá as observações que escrevemos
// para dadosObservacoes
observacoes.DOMNode.appendChild(dadosObservacoes);

//Mostra o arquivo xml gerado
Memo1.Lines.Text := XMLDocument1.XML.Text;
end;

No evento onClick do outro botão  coloque o seguinte código

procedure TForm1.Button2Click(Sender: TObject);
var
no :IXMLNode;
atualizacao :IXMLNode;
begin
//Para recuperar as observações que gravamos em CData basta encontrar
// o nó de observacoes e pegar sua propriedade Text.
// Consideramos aqui que o XMLDocument1 já esta ativado e com o XMLs

atualizacao := XMLDocument1.ChildNodes.FindNode('atualizacao');
no := atualizacao.ChildNodes.FindNode('observacoes');
Memo2.Text := no.Text;
end;

Novamente espero ter ajudado de alguma forma e aguardo suas dúvidas e sugestões.


Baixe os fontes do artigo no GitHub

Um comentário:


  1. This site was... how do I say it? Relevant!! Finally I have found something that helped me. Appreciate it! craigslist louisville

    ResponderExcluir

Diga-nos, o que achou deste artigo?