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.

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.

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
Exemplo de programa simples e totalmente funcional, bem comentado, valeu brother!!!
ResponderExcluirFico muito feliz em ter ajudado!
Excluiramigo me desculpe a ignorancia mas poderia me mostrar como vc cria a sua estrutura via delphi?
ResponderExcluirestou 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
Conteúdos com acento é possível importar?
ResponderExcluirSim é 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.
ExcluirJocimar,
ResponderExcluirExcelente 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
Jocimar,
ResponderExcluirExcelente 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
Jocimar,
ResponderExcluirExcelente 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
Jocimar,
ResponderExcluirExcelente 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
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
ExcluirOlá 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.
ResponderExcluirOlá 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.
ExcluirSe quiser me mandar um exemplo no Skype: jocimarspi
Bom dia Jocimar, esta exemple me ajudou muito.
ResponderExcluirEu 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
Bom dia Jocimar, esta exemple me ajudou muito.
ResponderExcluirEu 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 "<>"
Esqueci de avisar. Esta tag "funcao" é filha da tag "biblioteca" (no seu exemplo).
ResponderExcluir