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

domingo, 15 de julho de 2012

Manipulação de XML com TXMLDocument – Parte 2

Dando continuidade ao artigo sobre manipulação de XML onde estou mostrando como manipular arquivos XML utilizando o componente TXMLDocument, explicarei hoje como criar o seu próprio arquivo XML, pois no artigo anterior somente fizemos a manipulação de um arquivo XML já pronto.
Mostrarei como criar um XML a seguinte estrutura:
<atualizacao>
  <executaveis>
    <executavel versao='1.0.3.22' descricao='Modulo gerencial'>gerencial.exe</executavel>
    <executavel versao='1.0.3.123' descricao='Configuracoes da Aplicacao'>configuracoes.exe</executavel>
  </executaveis>
  <bibliotecas>
    <biblioteca versao='2.0.0.1' descricao='Biblioteca de funcoes'>funcoes.dll</biblioteca>
    <biblioteca versao='1.2.0.4' descricao='Biblioteca com rotinas de negocio da aplicacao'>app.dll</biblioteca>
  </bibliotecas>
</atualizacao>

Então vamos lá! Crie no delphi um novo projeto e arraste um TMemo, um TButton e um TXMLDocument para o Form.

tela3

No evento onClick do TButton que foi adicionado a tela, escreva o seguinte código:
procedure TForm1.Button1Click(Sender: TObject);
var
  atualizacao :IXMLNode;
  executaveis :IXMLNode;
  executavel :IXMLNode;
  bibliotecas :IXMLNode;
  biblioteca :IXMLNode;
begin
  //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');
  executavel.SetAttributeNS('descricao','','Modulo gerencial');
  executavel.Text := 'gerencial.exe'; 

  //Adiciona um executavel ao nó de executaveis
  executavel := executaveis.AddChild('executavel');
  executavel.SetAttributeNS('versao','','1.0.3.123');
  executavel.SetAttributeNS('descricao','','Configuracoes da Aplicacao');
  executavel.Text := 'configuracoes.exe';

  //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.SetAttributeNS('descricao','','Biblioteca de funcoes');
  biblioteca.Text := 'funcoes.dll';

  //Adiciona uma biblioteca ao nó de biblioteca
  biblioteca := bibliotecas.AddChild('biblioteca');
  biblioteca.SetAttributeNS('versao','','1.2.0.4');
  biblioteca.SetAttributeNS('descricao','','Biblioteca com rotinas de negocio da aplicacao');
  biblioteca.Text := 'app.dll'; 

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

Se tudo ocorrer bem ao clicar no TButton do formulário será apresentado o texto do XML gerado pelo exemplo.

É isso aí pessoal, espero ter ajudado e aguardo suas dúvidas, comentários e sugestões.
Baixe os fontes do artigo no GitHub

sábado, 7 de julho de 2012

Manipulação de XML com TXMLDocument

Neste artigo mostrarei como usar o componente TXMLDocument do delphi para manipular arquivos XML. Em várias situações podemos utilizar arquivos XML em nossas aplicações como por exemplo para guardar as configurações.
Para exemplificar vou utilizar um XML que tem a finalidade de guardar informações para a atualização de um conjunto de executáveis e bibliotecas.

<atualizacao>
  <executaveis>
    <executavel versao='1.0.3.22' descricao='Modulo gerencial'>gerencial.exe</executavel>
    <executavel versao='1.0.3.123' descricao='Configuracoes da Aplicacao'>configuracoes.exe</executavel>
  </executaveis>
  <bibliotecas>
    <biblioteca versao='2.0.0.1' descricao='Biblioteca de funcoes'>funcoes.dll</biblioteca>
    <biblioteca versao='1.2.0.4' descricao='Biblioteca com rotinas de negocio da aplicacao'>app.dll</biblioteca>
  </bibliotecas>
</atualizacao>

Para criar esse exemplo estou utilizando a IDE delphi XE, mas você pode utilizar versões anteriores. Vamos por a mão na massa então! Crie um novo projeto no delphi e arraste um o componente TXMLDocument para o formulário.

tela1

Agora vamos copiar o XML de exemplo acima para a propriedade XML do TXMLDocument que adicionamos ao formulário. Também vamos adicionar um TMemo e um TButton ao formulário.

tela2

Coloque o código abaixo no evento de clique do botão que adicionamos na tela:

procedure TForm1.Button1Click(Sender: TObject);
var aplicacao :IXMLNode;

    executaveis :IXMLNode;
    executavel :IXMLNode;

    bibliotecas :IXMLNode;
    biblioteca :IXMLNode;

    versao :IXMLNode;
    descricao :IXMLNode;
    infNo :IXMLNodeList;

    i :Integer;
begin
   Memo1.Clear;

   //Ativa o XMLDocument para podemos ler as informações do xml
   XMLDocument1.Active := true;

   //Busco o nó principal do xml
   aplicacao := XMLDocument1.DocumentElement;

   //Busca o nó onde está a lista de executáveis
   executaveis := aplicacao.ChildNodes.FindNode('executaveis');

   //Busca o nó onde está a lista de bibliotecas
   bibliotecas := aplicacao.ChildNodes.FindNode('bibliotecas');

   memo1.Lines.Add('[EXECUTAVEIS]');
   memo1.Lines.Add('');

   //Percorre todos os executáveis da lista
   for i := 0 to executaveis.ChildNodes.Count - 1 do
   begin
      executavel := executaveis.ChildNodes[i];
      //recupera os atributos do nó executavel
      infNo      := executavel.AttributeNodes;

      memo1.Lines.Add(executavel.Text);
      memo1.Lines.Add('-------------------------');
      memo1.Lines.Add('versão: '+infNo.FindNode('versao').Text);
      memo1.Lines.Add('descrição: '+infNo.FindNode('descricao').Text);
      memo1.Lines.Add('');
   end;

   memo1.Lines.Add('');
   memo1.Lines.Add('[BIBLIOTECAS]');
   memo1.Lines.Add('');

   //Percorre todas as bibliotecas
   for i := 0 to bibliotecas.ChildNodes.Count - 1 do
   begin
      biblioteca := bibliotecas.ChildNodes[i];

      //recupera os atributos do nó biblioteca
      infNo      := biblioteca.AttributeNodes;

      memo1.Lines.Add(biblioteca.Text);
      memo1.Lines.Add('-------------------------');
      memo1.Lines.Add('versão: '+infNo.FindNode('versao').Text);
      memo1.Lines.Add('descrição: '+infNo.FindNode('descricao').Text);
      memo1.Lines.Add('');
   end;
end;

Podemos observar que o código simplesmente manipula o XML de exemplo gerando um texto mostrando algumas de suas informações.
Bom é isso! Deixem seus comentários e dúvidas. Até a próxima.

Baixe os fontes do artigo no GitHub