String de XML

Delphi

05/03/2004

Seguinte gente. Eu usei o TIdHttp para fazer uma conexão à uma página com um servidor PHP. Este servidor responde, retornando uma string em XML. Para ser mais específico, o servidor me retorna isto:

[b:8410845a66][i:8410845a66]
<nome>Danilo Cesar</nome>
<mail>danilo_eu@hotmail.com</mail>
<senha>831caa1b600f852b7844499430ecac17</senha>
<nick>Birilo Nilo</nick>
<cod>0f7f6ab7513432986422eec01fbac9ba</cod>
[/i:8410845a66][/b:8410845a66]

Este resultado eu salvo em uma String fazendo assim.

conector:= TIdHttp.get(´http://servidor.com/xml.php?id=4´)


Mas então, eu quero acessar somente campo nome, mas não sei como...
Alguém pode me dar uma ajuda?

Abraços, Danilo


Birilo

Birilo

Curtidas 0

Respostas

Birilo

Birilo

05/03/2004

Esqueci de uma coisa...
Tipo, a String tá assim

[i][b]<usuario id=´4´>
<nome>Danilo Cesar</nome> 
<mail>danilo_eu@hotmail.com</mail> 
<senha>831caa1b600f852b7844499430ecac17</senha> 
<nick>Birilo Nilo</nick> 
<cod>0f7f6ab7513432986422eec01fbac9ba</cod>
</usuario>[/b][/i] 


E eu queria acessar aproximadamente assim:

Caixa.text := xml.nome;


Alguém faz alguma idéia de como fazer isso??


GOSTEI 0
Birilo

Birilo

05/03/2004

Esqueci de uma coisa... Tipo, a String tá assim
<usuario id=´4´>
<nome>Danilo Cesar</nome> 
<mail>danilo_eu@hotmail.com</mail> 
<senha>831caa1b600f852b7844499430ecac17</senha> 
<nick>Birilo Nilo</nick> 
<cod>0f7f6ab7513432986422eec01fbac9ba</cod>
</usuario> 
E eu queria acessar aproximadamente assim:
Caixa.text := xml.nome;
Alguém faz alguma idéia de como fazer isso??



GOSTEI 0
Andrey

Andrey

05/03/2004

O Delphi 6 e 7 apresentam um componente chamado XMLDocument com o qual vc pode extrair dados de um XML diretamente do arquivo.
Se vc não tiver essas versões do Delphi, acho q vc vai ter q fazer uma rotina pra reconhecer o <nome> e o </nome> e pegar o q tem entre eles!


GOSTEI 0
Birilo

Birilo

05/03/2004

OK, estou usando Delphi 7 com o XmlDocument

Mas não estou conseguindo retornar o valor.
Estou fazendo assim:

texto.Text := xml.XML.Values[´nome´];


onde xml é um XmlDocument

Também tentei com

texto.Text := xml.XML.Values[´usuario/nome´];

Mas ainda não deu certo... O Que fazer?


GOSTEI 0
Andrey

Andrey

05/03/2004

Bom, antes certifique-se de que a propriedade FileName do XMLDocument esteja apontando para o arquivo XML.
Então dê um active := True e tente:
Texto.Text := XML.DocumentElement.ChildNodes[0].ChildNodes[´nome´].Text

Onde o ChildNodes[0] se refere ao primeiro registro(isso se o seu arquivo XML só tiver este registro) e o ChildNodes[´nome´] se refere ao campo ´nome´ desse registro.


GOSTEI 0
Birilo

Birilo

05/03/2004

xml.XML.Text := texto.Text;
xml.Active:=true;
nome.Text := xml.DocumentElement.ChildNodes[0].ChildNodes[´mail´].Text;


Mas infelizmente não deu certo....

Eu coloco o codigo xml na richtext texto, copio pra dentro do XmlDocument. Depois eu o ativo.

Dae o resultado do DocumentElement eu jogo pra dentro de um text chamado nome, mas não funciona. Ele fica em branco....

O Que eu estou fazendo de errado?


GOSTEI 0
Birilo

Birilo

05/03/2004

Ok, consegui...
Já dei um jeito...

Apenas retirei aquele primeiro ChildNode[0], pois tenho apenas um Node...
Também agora estou fazendo com DOMDocument....

Valeu a ajuda....
Brigadão...


GOSTEI 0
Jasig Aurumalfa

Jasig Aurumalfa

05/03/2004

Crie um arquivo, ou um banco de dados, e converta para ele ler a leitura e então é só manipular o arquivo... :D
Espero ter ajudado... :wink:


GOSTEI 0
Zacca

Zacca

05/03/2004

cara eu uso assimm... eu leh indicaria gravar em um arquivo xml e depois carrega-lo...

procedure RecebeXML(Sender : tobject);
var
 sr: TSearchRec;
 i:integer;
 n: TxmlNode;
 path1 : string;
begin

if FRMPrincipal.ArqIni.ReadString(´Path´,´Amostras´,´´)=´´ then
  path1:=ExtractFilePath(Application.ExeName)+´\Amostras\´
  else
    path1:=FRMPrincipal.ArqIni.ReadString(´Path´,´Amostras\´,´´);

if (FindFirst(path1, faAnyFile, sr)=0) then
  begin
    repeat
      Application.ProcessMessages;
      FRMPrincipal.StatusBar1.Panels[3].Text := ´  Recebendo Amostra: ´+sr.Name;
      FRMPrincipal.TXMLPasta.Enabled:=false;

      // começa a utilizar o xml para enviar
      Parser := TXMLParser.Create;
      XML    := Parser.LoadFile(path1+´\*.xml´+sr.Name);

      n:= XML[´Paciente/Exames´];
      if (Assigned(n)) then
        begin
          for i := 1 to n.ChildrenCount do
            begin
              DMTabelas.TBTempora.Append;
              DMTabelas.TBTempora.FieldByName(´Amostra´).asstring  := XML[´Paciente/Amostra´].value;
              DMTabelas.TBTempora.FieldByName(´Nome´).asstring     := XML[´Paciente/Nome´].value;
              DMTabelas.TBTempora.FieldByName(´Sexo´).asstring     := XML[´Paciente/Sexo´].value;
              DMTabelas.TBTempora.FieldByName(´CodPac´).asstring   := XML[´Paciente/CodPac´].value;
              DMTabelas.TBTempora.FieldByName(´Nasc´).asstring     := XML[´Paciente/Nascimento´].value;
              DMTabelas.TBTempora.FieldByName(´Medico´).asstring   := XML[´Paciente/Medico´].value;
              DMTabelas.TBTempora.FieldByName(´Material´).asstring := XML[´Paciente/Material´].value;
              DMTabelas.TBTempora.FieldByName(´Data´).asstring     := XML[´Paciente/Data´].value;
              DMTabelas.TBTempora.FieldByName(´Hora´).asstring     := XML[´Paciente/Hora´].value;

              if (AnsiSameText(n.Child[i].Name, ´Exame´)) then
                begin
                  DMTabelas.TBTempora.FieldByName(´Exame´).asstring    := n.Child[i].Value;
                end;

              DMTabelas.TBTempora.Post;
            end;
        end;

     copyfile(pchar(path1+sr.name),pchar(ExtractFilePath(Application.ExeName)+´Antigo\´+ExtractFilename(sr.name)),true);
     DeleteFile(path1+ExtractFilename(sr.name));

     FRMPrincipal.TXMLPasta.Enabled:=true;

    until FindNext(sr)<>0;

  end;
end;


precisa de um componente se quiser madna um email rpa mim...


GOSTEI 0
POSTAR