Social Icons

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

15 comentários:

  1. Exemplo de programa simples e totalmente funcional, bem comentado, valeu brother!!!

    ResponderExcluir
  2. amigo me desculpe a ignorancia mas poderia me mostrar como vc cria a sua estrutura via delphi?

    estou tentando aki, mas estou me enrolando.... só um detalhe n vale usar um TXT/stringlist, tem q ser usando o txmldocument (de preferencia criado em tempo de execucao como estou tentando fazer ok?)



    gerencial.exe
    configuracoes.exe


    funcoes.dll
    app.dll

    ResponderExcluir
  3. Diego Fernandes de Paula31 de janeiro de 2014 09:21

    Conteúdos com acento é possível importar?

    ResponderExcluir
    Respostas
    1. Sim é possível, basta ajustar o encoding do XML para um que aceite que acentos. Criarei uma postagem em breve passando um exemplo dessa situação.

      Excluir
  4. Jocimar,

    Excelente exemplo de leitura de arquivo XML, parabéns.

    Você teria algum exemplo para a criação de um arquivo XML baseado em um esquema?

    Abraços,

    Marcelo Calmon

    ResponderExcluir
  5. Jocimar,

    Excelente exemplo de leitura de arquivo XML, parabéns.

    Você teria algum exemplo para a criação de um arquivo XML baseado em um esquema?

    Abraços,

    Marcelo Calmon

    ResponderExcluir
  6. Jocimar,

    Excelente exemplo de leitura de arquivo XML, parabéns.

    Você teria algum exemplo para a criação de um arquivo XML baseado em um esquema?

    Abraços,

    Marcelo Calmon

    ResponderExcluir
  7. Jocimar,

    Excelente exemplo de leitura de arquivo XML, parabéns.

    Você teria algum exemplo para a criação de um arquivo XML baseado em um esquema?

    Abraços,

    Marcelo Calmon

    ResponderExcluir
    Respostas
    1. Olá Marcelo, obrigado. Fico feliz em ajudar. Veja o seguinte post que eu fiz sobre manipulação de XML utilizando esquema no DELPHI. http://www.sobreprogramacao.com.br/2012/08/xml-data-bind-no-delphi.html

      Excluir
  8. Olá faço quase que igual isso para manipulação do xml. Quando eu estou lendo um XML e dando Load no XMLDocument e se tiver carateres especiais ou alguma sujeira ele dá erro.. Você sabe como tratar isso? eu fiz uma função para remover acentos e alguns carateres especiais, mas quando se copia algo do Word ou de PDF e cola no campo do DBMemo e tenta dar Load desse arquivo dá erro de caracter especial. Obrigado.

    ResponderExcluir
    Respostas
    1. Olá Rodrigo, desculpe pela demora. Bom se entendi bem, você está copiando o arquivo XML direto de um arquivo do word ou PDF e colando no DBMemo? Bom temos que tomar cuidado com esse tipo de operação, pois a codificação do texto pode estar muito diferente e pode ser por esse motivo que você não consegue carregar o XML. Mas se quiser pode me enviar um exemplo para eu analisar. Outra coisa para você tentar é cole esse mesmo texto em um editor, como por exemplo o notepad++, e veja qual a codificação ele identifica para o texto.

      Se quiser me mandar um exemplo no Skype: jocimarspi

      Excluir
  9. Bom dia Jocimar, esta exemple me ajudou muito.
    Eu tenho uma dúvida ainda, como você manipularia uma tag filha?

    Por exemplo:
    Se dentro da tag existir uma tag filha chamada



    Como você percorreria estes dados? Pois eu não consigo ler estas tags




    ResponderExcluir
  10. Bom dia Jocimar, esta exemple me ajudou muito.
    Eu tenho uma dúvida ainda, como você manipularia uma tag filha?

    Por exemplo:
    Se dentro da tag existir uma tag filha chamada "funcao"

    funcao versao='1.2.0.0' descricao='lerNumero'/funcao
    funcao versao='1.2.0.1' descricao='removeCaracterEspecial' /funcao

    Como você percorreria estes dados? Pois eu não consigo ler estas tags

    Tive que publicar novamente, pois não apareceu os "<>"

    ResponderExcluir
  11. Esqueci de avisar. Esta tag "funcao" é filha da tag "biblioteca" (no seu exemplo).

    ResponderExcluir

Diga-nos, o que achou deste artigo?