Ler arquivo XML com o Delphi Xe

04/01/2019

18

Boa tarde amigos,

Estou tentando ler o arquivo abaixo com o seguinte codigo e volta tudo em branco o resultado.

Segue o XML:

<resultados versao="20091119" datahora="2018-12-20 15:09:41">
<cadastros>
</cadastros>
<solicitacao codigo="9676929" codigo_aol="9676929" codigo_lis="CT-0000000045" paciente="LAB1000022">
<amostras>
<amostra codigo="0" identificacao="" descricao="SANGUE (SORO)" material="16"/>
<amostra codigo="1" identificacao="" descricao="Urina não cronometrada" material="20"/>
</amostras>
<exame codigo="CREAT-16" dataresultado="20/12/2018 15:09" metodo="Espectrofotométrico automatizado" observacao="TESTE" normal="S">
<resultado amostra="0" linharesultado="1" resultado="1,00" id_lis="CRE"/>
<resultado amostra="0" linharesultado="28" resultado="50,00" id_lis="CRE"/>
<resultado amostra="0" linharesultado="2" resultado="Sensibilidade palavra proibidaítica mínima: 0,1 mg/dL. Variabilidade biológica baixa.

Nota: Novos valores de referência a partir de 14/09/2018.
" id_lis="CRE"/>
<resultado amostra="0" linharesultado="999" resultado="TESTE
Liberado eletronicamente por: LUCIANO PALHARI." id_lis="CRE"/>
</exame>
<exame codigo="FAL-16" dataresultado="20/12/2018 15:09" metodo="Espectrofotométrico Enzimático - UV" observacao="TESTE" normal="S">
<resultado amostra="0" linharesultado="1" resultado="50,00" id_lis="FAL"/>
<resultado amostra="0" linharesultado="2" resultado="Variabilidade biológica baixa. Sensibilidade palavra proibidaítica mínima: > 10 U/L
" id_lis="FAL"/>
<resultado amostra="0" linharesultado="999" resultado="TESTE
Liberado eletronicamente por: LUCIANO PALHARI." id_lis="FAL"/>
</exame>
<exame codigo="HDL-16" dataresultado="20/12/2018 15:09" metodo="Enzimático-Automatizado" observacao="TESTE" normal="S">
<resultado amostra="0" linharesultado="1" resultado="50,00" id_lis="HDL"/>
<resultado amostra="0" linharesultado="8" resultado="Sensibilidade palavra proibidaítica: > 5 mg/dL. Conversão: mmol/L = mg/dL x 0,026. Variabilidade biológica baixa.
Valores de referência: Segunda a Soc. Bras. Cardiologia: Vª Diretriz Brasileira de Dislipidemias e Prevenção da Aterosclerose - 2013.
Novos valores de referência disponibilizados a partir de 03/07/2017." id_lis="HDL"/>
<resultado amostra="0" linharesultado="999" resultado="TESTE
Liberado eletronicamente por: LUCIANO PALHARI." id_lis="HDL"/>
</exame>
<exame codigo="LDL-16" dataresultado="20/12/2018 15:09" metodo="Enzimático-Automatizado" observacao="TESTE" normal="S">
<resultado amostra="0" linharesultado="1" resultado="50,00" id_lis="LDL"/>
<resultado amostra="0" linharesultado="8" resultado="Segundo o Vº Consenso Brasileiro de SBC VR para colesterol-LDL foram substituídos pelos valores de Meta Terapêutica, estratificados conforme o Risco Cardiovascular Calculado. Os valores de Colesterol-LDL são obtidos por dosagem direta e não mais por cálculo. Valores de CT maior ou igual a 310 mg/dL para adultos e maior ou igual 230 mg/dL (de 2 a 19 anos) podem indicar hipercolesterolemia Familiar. Em casos de níveis de triglicérides > 440 mg/dL, coletado sem jejum, é sugerido nova coleta para nova determinação, com jejum de 12 horas. Na concomitância de solicitação de outros exames laboratoriais pode haver necessidade de jejum e/ou repouso como preparo pré-palavra proibidaítico. Sensibilidade palavra proibidaítica: > 10 mg/dL.
Novos valores referenciais e de notas disponibilizados a partir 03/07/2017." id_lis="LDL"/>
<resultado amostra="0" linharesultado="999" resultado="TESTE
Liberado eletronicamente por: LUCIANO PALHARI." id_lis="LDL"/>
</exame>
<exame codigo="T3-16" dataresultado="20/12/2018 15:09" metodo="Quimioluminescência - Automatizada" observacao="TESTE" normal="S">
<resultado amostra="0" linharesultado="1" resultado="1,00" id_lis="T3"/>
<resultado amostra="0" linharesultado="2" resultado="Sensibilidade palavra proibidaítica: > 0,10 ng/mL. Variabilidade biológica média. (ng/dL x 0,01536 = nmol/L)
Nota: A presença de anticorpos contra componentes do ensaio, pode interferir nos resultados." id_lis="T3"/>
<resultado amostra="0" linharesultado="999" resultado="TESTE
Liberado eletronicamente por: LUCIANO PALHARI." id_lis="T3"/>
</exame>
<exame codigo="T3L-16" dataresultado="20/12/2018 15:09" metodo="Quimioluminescência - Automatizada" observacao="TESTE" normal="S">
<resultado amostra="0" linharesultado="1" resultado="Superior a 20,00 pg/mL" id_lis="T3L"/>
<resultado amostra="0" linharesultado="2" resultado="Variabilidade biológica baixa. Sensibilidade palavra proibidaítica: > 0,2 pg/mL.
A presença de anticorpos contra componentes do ensaio, pode interferir nos resultados.
" id_lis="T3L"/>
<resultado amostra="0" linharesultado="999" resultado="TESTE
Liberado eletronicamente por: LUCIANO PALHARI." id_lis="T3L"/>
</exame>
<exame codigo="TRIG-16" dataresultado="20/12/2018 15:09" metodo="Enzimático-Automatizado - AD" observacao="TESTE" normal="S">
<resultado amostra="0" linharesultado="1" resultado="50,00" id_lis="TRI"/>
<resultado amostra="0" linharesultado="2" resultado="Sensibilidade palavra proibidaítica: > 5 mg/dL. Conversão: mmol/L = mg/dL x0,0113
Valores de refer. da Soc. Bras. Cardiologia-Vª Diretriz Brasileira sobre Dislipidemias e Prevenção da Aterosclerose-Out-2013. Variabilidade biológica moderada. Em casos de níveis de triglicérides > 440mg/dL, coletado sem jejum, é sugerido nova coleta para determinação deste analito, com jejum de 12 horas. Na concomitância de solicitação de outros exames laboratoriais pode haver necessidade de jejum e/ou repouso como preparo pré-palavra proibidaítico.
Novos valores de referênciais disponibilizados a partir de 05/07/2017" id_lis="TRI"/>
<resultado amostra="0" linharesultado="999" resultado="TESTE
Liberado eletronicamente por: LUCIANO PALHARI." id_lis="TRI"/>
</exame>
<exame codigo="UREIA-16" dataresultado="20/12/2018 15:09" metodo="Enzimático-Automatizado" observacao="TESTE" normal="S">
<resultado amostra="0" linharesultado="1" resultado="50,00" id_lis="URE"/>
<resultado amostra="0" linharesultado="2" resultado="Variabilidade biológica baixa" id_lis="URE"/>
<resultado amostra="0" linharesultado="999" resultado="TESTE
Liberado eletronicamente por: LUCIANO PALHARI." id_lis="URE"/>
</exame>
<exame codigo="VLDL-16" dataresultado="20/12/2018 15:09" metodo="Enzimático-Automatizado" observacao="TESTE" normal="S">
<resultado amostra="0" linharesultado="1" resultado="10,00" id_lis="VLDL"/>
<resultado amostra="0" linharesultado="4" resultado="" id_lis="VLDL"/>
<resultado amostra="0" linharesultado="5" resultado="Sensibilidade palavra proibidaítica: > 5 mg/dL. Conversão: mmol/L=mg/dL x 0,026. Variabilidade biológica moderada.
Referência: Vª Diretriz Brasileira de Dislipidemias e Prevenção da Aterosclerose - Out. 2013.O VLDL sofre grande influência da Fase Pré-palavra proibidaítica, como jejum, dieta habitual, bebidas alcoólicas, postura e medicamentos. Com triglicérides > 440 mg/dL, coletado sem jejum, é sugerido nova coleta, com jejum de 12 horas. Na concomitância de solicitação de outros exames laboratoriais pode haver necessidade de jejum e/ou repouso como preparo pré-palavra proibidaítico.
" id_lis="VLDL"/>
<resultado amostra="0" linharesultado="999" resultado="TESTE
Liberado eletronicamente por: LUCIANO PALHARI." id_lis="VLDL"/>
</exame>
<exame codigo="CORTIL-20" dataresultado="20/12/2018 15:09" metodo="Quimioluminescência - Automatizada" observacao="TESTE" normal="S">
<resultado amostra="1" linharesultado="3" resultado="10,00" id_lis="CORTL"/>
<resultado amostra="1" linharesultado="7" resultado="A presença de anticorpos contra algum componente do ensaio, embora rara, pode interferir nos resultados.

Variabilidade biológica alta." id_lis="CORTL"/>
<resultado amostra="1" linharesultado="999" resultado="TESTE
Liberado eletronicamente por: LUCIANO PALHARI." id_lis="CORTL"/>
</exame>
</solicitacao>
</resultados>


Com o seguinte codigo:
var
vXMLDoc: TXM
Responder

Post mais votado

04/01/2019

E ae Jorge, por curiosidade resolvi ler esse seu XML kkkk , cara se foi você quem montou esse XML tenta estruturar ele no formato padrão de XML com childs (Um bom exemplo é o modelo de NFe e CTe), caso tenha recebido de algum fornecedor ai não tem outra forma tem que ajustar esse embolo para pegar os dados.

Bem fiz um teste para pegar fragmentos do seu xml, montei ele no mesmo local da aplicação e deu certo, o detalhe é que você precisa ler por atributos, segue o modelo que fiz para testar :

procedure TForm1.FormCreate(Sender: TObject);
var vXMLDoc: TXMLDocument;
NodeSec : IXMLNode;
begin

  vXMLDoc := TXMLDocument.Create(self);

  vXMLDoc.LoadFromFile(ExtractFilePath(Application.ExeName)+'teste.xml');
  Memo1.lines.Add( '-------------------------------------------------');
  Memo1.lines.Add( '(apenas para ver o resultado do teste');
  vXMLDoc.Active := True;
  Memo1.lines.Add( VXMLDoc.DocumentElement.ChildNodes.Nodes[0].ChildNodes.Nodes[0].text); // no do cadastro
  Memo1.lines.Add( VXMLDoc.DocumentElement.ChildNodes.Nodes[1].ChildNodes.Nodes[1].Attributes['codigo']); // pegar o codigo do exame
  Memo1.lines.Add( VXMLDoc.DocumentElement.ChildNodes.Nodes[1].ChildNodes.Nodes[1].Attributes['metodo']); // pegar o metodo do exame
  FreeAndNil(vXMLDoc);
end;





Espero que o exemplo te ajuda, boa sorte.
Responder

Mais Posts

04/01/2019

Jorge Junior

Com o seguinte codigo:
var
vXMLDoc: TXMLDocument;
NodeSec : IXMLNode;
vcodigo_lis, vpaciente, vcodigoaol, vcodigo : wideString;
i : integer;
begin
if MessageDlg('Deseja receber os resultados do Grupo São Camilo?', mtConfirmation,
[mbNo, mbYes], 1) = mrYes then
begin

vXMLDoc := TXMLDocument.Create(self);
vXMLDoc.LoadFromFile('C:\\APLUSLAB14\\scamilo\\resultado\\Resultados_3000_20181220150941.xml');
Memo1.lines.Add( '-------------------------------------------------');
Memo1.lines.Add( '(apenas para ver o resultado do teste');
vXMLDoc.Active := True;
// Memo1.lines.Add( VXMLDoc.XML.Text +#13+#13 );

NodeSec := vXMLDoc.DocumentElement.ChildNodes.FindNode('solicitacao');

NodeSec.ChildNodes.First;

repeat
vcodigo_lis := NodeSec.ChildNodes['codigo_lis'].text;
vpaciente := NodeSec.ChildNodes['paciente'].text;
vcodigo := NodeSec.ChildNodes['codigo'].text;
vcodigoaol := NodeSec.ChildNodes['codigo_aol'].text;
NodeSec := NodeSec.NextSibling;

Memo1.Lines.Add( vpaciente + ' , '+vcodigo_lis + ' , '+vcodigo + ' , '+ vcodigoaol )
until Nodesec = nil;

ShowMessage('Importação dos resultados, com sucesso!');
end;

end;

Porem o resultado aparece assim:

-------------------------------------------------
(apenas para ver o resultado do teste
, , ,
, , ,
, , ,
, , ,
, , ,
Responder

04/01/2019

Jorge Junior

E ae Jorge, por curiosidade resolvi ler esse seu XML kkkk , cara se foi você quem montou esse XML tenta estruturar ele no formato padrão de XML com childs (Um bom exemplo é o modelo de NFe e CTe), caso tenha recebido de algum fornecedor ai não tem outra forma tem que ajustar esse embolo para pegar os dados.

Bem fiz um teste para pegar fragmentos do seu xml, montei ele no mesmo local da aplicação e deu certo, o detalhe é que você precisa ler por atributos, segue o modelo que fiz para testar :

procedure TForm1.FormCreate(Sender: TObject);
var vXMLDoc: TXMLDocument;
NodeSec : IXMLNode;
begin

  vXMLDoc := TXMLDocument.Create(self);

  vXMLDoc.LoadFromFile(ExtractFilePath(Application.ExeName)+'teste.xml');
  Memo1.lines.Add( '-------------------------------------------------');
  Memo1.lines.Add( '(apenas para ver o resultado do teste');
  vXMLDoc.Active := True;
  Memo1.lines.Add( VXMLDoc.DocumentElement.ChildNodes.Nodes[0].ChildNodes.Nodes[0].text); // no do cadastro
  Memo1.lines.Add( VXMLDoc.DocumentElement.ChildNodes.Nodes[1].ChildNodes.Nodes[1].Attributes['codigo']); // pegar o codigo do exame
  Memo1.lines.Add( VXMLDoc.DocumentElement.ChildNodes.Nodes[1].ChildNodes.Nodes[1].Attributes['metodo']); // pegar o metodo do exame
  FreeAndNil(vXMLDoc);
end;



Boa tarde amigo,
Este XML eu recebo de um laboratorio, ja reclamei e eles falam que é o padrão deles.

as tags que preciso pegar as informações são:

<solicitacao codigo="9676929" codigo_aol="9676929" codigo_lis="CT-0000000045" paciente="LAB1000022">

Nesta tag preciso do codigo, codigo_lis e paciente.
e

<exame codigo="CREAT-16" dataresultado="20/12/2018 15:09" metodo="Espectrofotométrico automatizado" observacao="TESTE" normal="S">
<resultado amostra="0" linharesultado="1" resultado="1,00" id_lis="CRE"/>
<resultado amostra="0" linharesultado="28" resultado="50,00" id_lis="CRE"/>
<resultado amostra="0" linharesultado="2" resultado="Sensibilidade analítica mínima: 0,1 mg/dL. Variabilidade biológica baixa. Nota: Novos valores de referência a partir de 14/09/2018. " id_lis="CRE"/>
<resultado amostra="0" linharesultado="999" resultado="TESTE Liberado eletronicamente por: LUCIANO PALHARI." id_lis="CRE"/>
</exame>

Nesta tag preciso do codigo e linharesultado.

Tem como me ajudar? Não estou conseguindo entender os nodes.

Deste ja muito grato,
Responder

07/01/2019

Jucélio Silva

Opa Jorge, to no corre hoje, mas parei um pouco aqui para motar um exemplo de como ler os filhos desses cara, só se atenta que os índices que to usando estão fixos, você vai precisar de laços para cada nó pai que tenha N filhos etc...

Roda esse codigo com se xml de exemplo que vai ficar facil de entender como pegar todos os demais... OSSO TER QUE RECEBER ESSE TIPO DE XML...

Boa sorte ai amigo ...

procedure TForm1.FormCreate(Sender: TObject);
var vXMLDoc: TXMLDocument;
NodeSec : IXMLNode;
begin

  vXMLDoc := TXMLDocument.Create(self);

  vXMLDoc.LoadFromFile(ExtractFilePath(Application.ExeName)+'teste.xml');
  Memo1.lines.Add( '-------------------------------------------------');
  Memo1.lines.Add( '(apenas para ver o resultado do teste');
  vXMLDoc.Active := True;
  Memo1.lines.Add( '-------------------------------------------------');

  Memo1.lines.Add( ' lendo esse cara :  <exame codigo="CREAT-16" dataresultado="20/12/2018 15:09" metodo="Espectrofotométrico automatizado" observacao="TESTE" normal="S"> ');
  Memo1.lines.Add( VXMLDoc.DocumentElement.ChildNodes.Nodes[1].ChildNodes.Nodes[1].Attributes['codigo']); // pegar o codigo do exame
  Memo1.lines.Add( VXMLDoc.DocumentElement.ChildNodes.Nodes[1].ChildNodes.Nodes[1].Attributes['dataresultado']); // pegar o dataresultado do exame
  Memo1.lines.Add( VXMLDoc.DocumentElement.ChildNodes.Nodes[1].ChildNodes.Nodes[1].Attributes['metodo']); // pegar o metodo do exame
  Memo1.lines.Add( VXMLDoc.DocumentElement.ChildNodes.Nodes[1].ChildNodes.Nodes[1].Attributes['observacao']); // pegar a observacao do exame
  Memo1.lines.Add( VXMLDoc.DocumentElement.ChildNodes.Nodes[1].ChildNodes.Nodes[1].Attributes['normal']); // pegar se é normal

  Memo1.lines.Add( ' lendo os resultados : <resultado amostra="0" linharesultado="1" resultado="1,00" id_lis="CRE"/> ');
  Memo1.lines.Add( VXMLDoc.DocumentElement.ChildNodes.Nodes[1].ChildNodes.Nodes[1].ChildNodes.Nodes[1].Attributes['amostra']); // pegar amostra
  Memo1.lines.Add( VXMLDoc.DocumentElement.ChildNodes.Nodes[1].ChildNodes.Nodes[1].ChildNodes.Nodes[1].Attributes['linharesultado']); // pegar linharesultado
  Memo1.lines.Add( VXMLDoc.DocumentElement.ChildNodes.Nodes[1].ChildNodes.Nodes[1].ChildNodes.Nodes[1].Attributes['resultado']); // pegar resultado
  Memo1.lines.Add( VXMLDoc.DocumentElement.ChildNodes.Nodes[1].ChildNodes.Nodes[1].ChildNodes.Nodes[1].Attributes['id_lis']); // pegar id_lis

  FreeAndNil(vXMLDoc);
end;
Responder
×
+1 DevUP
Acesso diário, +1 DevUP
Parabéns, você está investindo na sua carreira