ActiveDelphi - Índice do Fórum ActiveDelphi
.: O site do programador Delphi! :.
 
 FAQFAQ   PesquisarPesquisar   MembrosMembros   GruposGrupos   RegistrarRegistrar 
 PerfilPerfil   Entrar e ver Mensagens ParticularesEntrar e ver Mensagens Particulares   EntrarEntrar 

[Resolvido] Lendo arquivos XML

 
Novo Tópico   Responder Mensagem    ActiveDelphi - Índice do Fórum -> Delphi
Exibir mensagem anterior :: Exibir próxima mensagem  
Autor Mensagem
Yien
Novato
Novato


Registrado: Sexta-Feira, 6 de Abril de 2012
Mensagens: 52

MensagemEnviada: Sex Abr 06, 2012 11:52 am    Assunto: [Resolvido] Lendo arquivos XML Responder com Citação

Olá pessoal, gostaria de saber como eu posso ler um arquivo xml assim:

Código:
<cadastro>
   <pessoas>
      <pessoa> <nome>Fernando de Simas</nome> <idade>11</idade></pessoa>
      <pessoa> <nome>João Pedro Nunez</nome> <idade>23</idade></pessoa>
   </pessoas>
</cadastro>


Queria que retornasse o Nome, Idade.
Obrigado!


Editado pela última vez por Yien em Sáb Abr 07, 2012 9:58 am, num total de 1 vez
Voltar ao Topo
Ver o perfil de Usuários Enviar Mensagem Particular
imex
Moderador
Moderador


Registrado: Sexta-Feira, 7 de Janeiro de 2011
Mensagens: 11666

MensagemEnviada: Sex Abr 06, 2012 4:49 pm    Assunto: Responder com Citação

Boa tarde

Experimente mais ou menos desta forma:

Código:
procedure TForm1.Button1Click(Sender: TObject);
var
  XMLDoc: IXMLDocument;
  NodePessoas: IXMLNode;
  i: integer;
begin
  XMLDoc := TXMLDocument.Create(nil);
  XMLDoc.LoadFromFile('C:\XML\Teste.xml');
  NodePessoas := XMLDoc.DocumentElement.ChildNodes.FindNode('pessoas');
  if NodePessoas <> nil then
      for i := 0 to NodePessoas.ChildNodes.Count - 1 do
          if NodePessoas.ChildNodes[i].NodeName = 'pessoa' then
              with NodePessoas.ChildNodes[i] do
                  ShowMessage(ChildNodes['nome'].Text +
                              sLineBreak +
                              ChildNodes['idade'].Text);
end;


obs: é necessário adicionar as units XMLIntf e XMLDoc a clausula uses

Espero que ajude.


Editado pela última vez por imex em Qua Mar 08, 2023 10:23 am, num total de 2 vezes
Voltar ao Topo
Ver o perfil de Usuários Enviar Mensagem Particular
johnny-walker
Moderador
Moderador


Registrado: Sábado, 4 de Outubro de 2003
Mensagens: 10653
Localização: Contagem/MG - BRAZIL

MensagemEnviada: Sex Abr 06, 2012 5:51 pm    Assunto: Responder com Citação

Retornar isto até que é fácil, mas seu xml não pode ter acento.

Procure por xml aqui no fórum que vc acha...

Outra coisa que é bom vc utilizar é o xmlnotepad para eventuais erros no xml, assim vc descobre erros e fica bem mais fácil construir uma solução a partir daí.


bye
_________________
P.O.W.E.R B.Y D.E.L.P.H.I


Editado pela última vez por johnny-walker em Ter Fev 11, 2020 11:17 am, num total de 1 vez
Voltar ao Topo
Ver o perfil de Usuários Enviar Mensagem Particular MSN Messenger
Yien
Novato
Novato


Registrado: Sexta-Feira, 6 de Abril de 2012
Mensagens: 52

MensagemEnviada: Sáb Abr 07, 2012 9:57 am    Assunto: Responder com Citação

imex
Obrigado pela sua ajuda, vou muito util para mim.
Topico resolvido, tag adicionada.

Até a proxima amigos.
Voltar ao Topo
Ver o perfil de Usuários Enviar Mensagem Particular
Wolver
Membro Junior
Membro Junior


Registrado: Quinta-Feira, 9 de Fevereiro de 2006
Mensagens: 343

MensagemEnviada: Sex Ago 31, 2012 3:37 pm    Assunto: Responder com Citação

imex escreveu:
Boa tarde

Experimente mais ou menos desta forma:

Código:
procedure TForm1.Button1Click(Sender: TObject);
var
  XMLDoc: IXMLDocument;
  NodePessoas: IXMLNode;
  i: integer;
begin
  XMLDoc := TXMLDocument.Create(nil);
  XMLDoc.LoadFromFile('C:\XML\Teste.xml');
  NodePessoas := XMLDoc.DocumentElement.ChildNodes.FindNode('pessoas');
 [code] if NodePessoas <> nil then[/code]
      for i := 0 to NodePessoas.ChildNodes.Count - 1 do
          if NodePessoas.ChildNodes[i].NodeName = 'pessoa' then
              with NodePessoas.ChildNodes[i] do
                  ShowMessage(ChildNodes['nome'].Text +
                              sLineBreak +
                              ChildNodes['idade'].Text);
end;


obs: é necessário adicionar as units XMLIntf e XMLDoc a clausula uses

Espero que ajude.


imex,

Estou com um problema e ainda não consegui resolver.
E quando o nodepessoas for igual a nil ...o que quer dizer?O xml está inválido?

Código:
 if NodePessoas <> nil then
Voltar ao Topo
Ver o perfil de Usuários Enviar Mensagem Particular
imex
Moderador
Moderador


Registrado: Sexta-Feira, 7 de Janeiro de 2011
Mensagens: 11666

MensagemEnviada: Sex Ago 31, 2012 3:58 pm    Assunto: Responder com Citação

NodePessoas será igual a nil se o método FindNode não encontrar um nó com o nome passado como parâmetro.

Supondo que o primeiro nó do XML se chama 'pai', que abaixo exista o nó 'filhos', e que abaixo deste o nó 'netos':
Código:
<pai>
    <filhos>
        <netos>


Se você executar
Código:
  NodeFilhos := XMLDoc.DocumentElement.ChildNodes.FindNode('filhos');
  NodeNetos  := XMLDoc.DocumentElement.ChildNodes.FindNode('netos');

NodeFilhos será diferente de nil e NodeNetos igual a nil.


Mas se depois você executar
Código:
  NodeNetos := NodeFilhos.ChildNodes.FindNode('netos');

NodeNetos será diferente de nil.

Espero que ajude.
Voltar ao Topo
Ver o perfil de Usuários Enviar Mensagem Particular
Wolver
Membro Junior
Membro Junior


Registrado: Quinta-Feira, 9 de Fevereiro de 2006
Mensagens: 343

MensagemEnviada: Ter Set 11, 2012 9:13 am    Assunto: Responder com Citação

imex escreveu:
NodePessoas será igual a nil se o método FindNode não encontrar um nó com o nome passado como parâmetro.

Supondo que o primeiro nó do XML se chama 'pai', que abaixo exista o nó 'filhos', e que abaixo deste o nó 'netos':
Código:
<pai>
    <filhos>
        <netos>


Se você executar
Código:
  NodeFilhos := XMLDoc.DocumentElement.ChildNodes.FindNode('filhos');
  NodeNetos  := XMLDoc.DocumentElement.ChildNodes.FindNode('netos');

NodeFilhos será diferente de nil e NodeNetos igual a nil.


Mas se depois você executar
Código:
  NodeNetos := NodeFilhos.ChildNodes.FindNode('netos');

NodeNetos será diferente de nil.

Espero que ajude.



ok...Ajudou sim! Obrigado!
Voltar ao Topo
Ver o perfil de Usuários Enviar Mensagem Particular
Mostrar os tópicos anteriores:   
Novo Tópico   Responder Mensagem    ActiveDelphi - Índice do Fórum -> Delphi Todos os horários são GMT - 3 Horas
Página 1 de 1

 
Ir para:  
Enviar Mensagens Novas: Proibido.
Responder Tópicos Proibido
Editar Mensagens: Proibido.
Excluir Mensagens: Proibido.
Votar em Enquetes: Proibido.


Powered by phpBB © 2001, 2005 phpBB Group
Traduzido por: Suporte phpBB