Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Varios (https://www.clubdelphi.com/foros/forumdisplay.php?f=11)
-   -   Leer valores XML (https://www.clubdelphi.com/foros/showthread.php?t=94381)

cocute 09-01-2020 11:31:52

Leer valores XML
 
Hola han cambiado el formato del xml que necesito leer y no doy como leerlo:
Cita:

<?xml version="1.0" encoding="ISO-8859-1"?>
<observations xmlns="">
<observations>
<observations>
<stationID>IALMUDIDI</stationID>
<obsTimeUtc>2020-01-09T09:40:24Z</obsTimeUtc>
<obsTimeLocal>2020-01-09 10:40:24</obsTimeLocal>
<neighborhood>Abalate</neighborhood>
<softwareType>EasyWeatherV1.4.5</softwareType>
<country>ES</country>
<solarRadiation>91.13</solarRadiation>
<lon>-0.58356375</lon>
<epoch>1578562824</epoch>
<lat>42.04382324</lat>
<uv>1</uv>
<winddir>213</winddir>
<humidity>99</humidity>
<qcStatus>-1</qcStatus>
<metric>
<temp>-0.3888888888888885</temp>
<heatIndex>-0.3888888888888885</heatIndex>
<dewpt>-0.6111111111111119</dewpt>
<windChill>-0.3888888888888885</windChill>
<windSpeed>0</windSpeed>
<windGust>0</windGust>
<pressure>1020.522068496</pressure>
<precipRate>0</precipRate>
<precipTotal>0</precipTotal>
<elev>437.08320000000003</elev>
</metric>
</observations>
</observations>
</observations>
Alguien me puede decir como leo por ejemlo el valor neighborhood y el valor temp ?

tengo algo así pero se me ha olvidado como me muevo por los distintos nodos y demás y no doy
Código Delphi [-]

 try

XmlContent := GetContent('enlace del xml')
  except
    on E: Exception do
    begin
      Exit;
    end;
  end;

  if (not XmlContent.IsEmpty()) then
  begin
    XMLDoc.LoadFromXML(XmlContent);


begin

 StartItemNode := XMLDoc.DocumentElement.ChildNodes.FindNode('observations');
 label3.Text:=StartItemNode.childNodes['neighborhood'].Text;


 StartItemNode := XMLDoc.DocumentElement.ChildNodes.FindNode('metric');
  StartItemNode := XMLDoc.DocumentElement.ChildNodes.FindNode('temp') ;
 label1.Text:=  StartItemNode.Text+'ºC';



muuuchas gracias

xalo 09-01-2020 12:27:22

El XPath del nodo neighborhood es '/observations/observations/observations/neighborhood', por tanto tienes que buscar el nodo hijo dentro de observations/observations y ya lo obtendrás sin problemas.

Saludos

cocute 09-01-2020 14:50:23

Cita:

Empezado por xalo (Mensaje 535131)
El XPath del nodo neighborhood es '/observations/observations/observations/neighborhood', por tanto tienes que buscar el nodo hijo dentro de observations/observations y ya lo obtendrás sin problemas.

Saludos

muchas gracias entonces pongo
Código Delphi [-]
  StartItemNode := XMLDoc.DocumentElement.ChildNodes.FindNode('/observations/observations');
  label3.Text:=StartItemNode.childNodes['neighborhood'].Text;

o me estoy dejando algún obsevations?


Otra duda que me surge si el xml lo estoy descargando de una página segura https creo que no me deja pillar datos?
Código Delphi [-]
XmlContent := GetContent('https://api.weather.com/v2/pws/observations/current?stationId=IDDELAESTACION&format=xml&units=m&numericPrecision=decimal&apiKey=XXXXXXXXXXXXXX')
Alguna solución a esto?

xalo 09-01-2020 15:15:33

Cita:

Quote:
Originally Posted by xalo View Post
El XPath del nodo neighborhood es '/observations/observations/observations/neighborhood', por tanto tienes que buscar el nodo hijo dentro de observations/observations y ya lo obtendrás sin problemas.

Saludos
muchas gracias entonces pongo
Código Delphi [-]
StartItemNode := XMLDoc.DocumentElement.ChildNodes.FindNode('/observations/observations');
label3.Text:=StartItemNode.childNodes['neighborhood'].Text;

o me estoy dejando algún obsevations?
No estoy seguro ahora si lleva la / inicial, ....pero pruébalo.

Cita:

Otra duda que me surge si el xml lo estoy descargando de una página segura https creo que no me deja pillar datos?
Código Delphi [-]
XmlContent := GetContent('https://api.weather.com/v2/pws/observations/current?stationId=IDDELAESTACION&format=xml&units=m&numericPrecision=decimal&apiKey=XXXXXXXXXXXXXX')
Alguna solución a esto?
No entiendo la pregunta. Mira que recibes en xmlContent.

cocute 10-01-2020 09:59:37

Cita:

Empezado por xalo (Mensaje 535134)
No entiendo la pregunta. Mira que recibes en xmlContent.

es que no se que han tocado pero ya no consigo ver los ficheros xml que antes me permitía leer desde mi aplicación android,
si lo hago desde windows me deja pero desde android no.

por ejemplo este xml:
https://www.wunderground.com/weather...p?ID=IZARAGOZ9

como he dicho antes no se si puede ser porque ahora la dirección empieza por https en vez de por http

el fichero lo pillo con un IdHTTP con esta función, no si si eso es lo que debo cambiar, aunque antes me iba:
Código Delphi [-]
function GetContent(const URL: string): string;
  var
    Response: TStringStream;
  begin
    Response := TStringStream.Create(EmptyStr, TEncoding.UTF8);
    try
      IdHTTP1.Get(URL, Response);
      Result := Response.DataString;
    finally
      Response.Free();
    end;
  end;

xalo 10-01-2020 11:32:16

Cambia tu código por el que se menciona aquí y funcionará.

Otro tema que te encontrarás en Android es el tema de versiones de las librerías Openssl, pero si buscas en el foro, seguro que encuentras la solución.

Saludos

cocute 10-01-2020 17:12:55

Cita:

Empezado por xalo (Mensaje 535147)
Cambia tu código por el que se menciona aquí y funcionará.

Otro tema que te encontrarás en Android es el tema de versiones de las librerías Openssl, pero si buscas en el foro, seguro que encuentras la solución.

Saludos

muchas gracias por tu tiempo, ese link lo había encontrado yo también buscando sobre el tema pero
he metido ese código pero nada no cambia nada creo que no me le el xml,

sobre lo de las librerias Openssl no entiendo como debo proceder

cocute 10-01-2020 17:52:14

he encontrado esto:
https://stackoverflow.com/questions/...d-with-tidhttp

pero que debo hacer meter en el deploy las librerias en la carpeta:
library\lib\armeabi-v7a

sin añadir ningún código extra al programa o como ¿?

cocute 11-01-2020 17:55:43

me ha costado pero ya lo he solucionado con esto:

Cita:

Delphi

Project file
///////////////////////////////////////////////////////////
uses
System.StartUpCopy,
System.IoUtils,
FMX.Forms,
IdSSLOpenSSLHeaders,
{$IFDEF IOS}
IdSSLOpenSSLHeaders_Static,
{$ENDIF }
{$R *.res}

begin
Application.Initialize;
{$IFDEF ANDROID}
IdOpenSSLSetLibPath(TPath.GetDocumentsPath);
{$ENDIF}
Application.CreateForm(TMainForm, MainForm);
Application.Run;
end.
/////////////////////////////////////////////////////////////

Deploy libraries in documents folder
Project -> Deployment -> All Configurations -> android platform -> Add file -> select your libraries
set remote path for files to: .\assets\internal\


xalo 11-01-2020 19:21:04

Genial!
Pero podrías por favor detallar brevemente los pasos? así los siguientes podrán disfrutar del aporte que has hecho.

Muchas gracias

cocute 12-01-2020 09:41:09

no se si es necesario todo pero es lo que me ha funcionado,
en el fichero de nuestro proyecto dpr metemos las lineas que nos falten
Código PHP:

///////////////////////////////////////////////////////////
uses
System
.StartUpCopy,
System.IoUtils,
FMX.Forms,
IdSSLOpenSSLHeaders,
{
$IFDEF IOS}
IdSSLOpenSSLHeaders_Static,
{
$ENDIF }
{
$R *.res}

begin
Application
.Initialize;
{
$IFDEF ANDROID}
IdOpenSSLSetLibPath(TPath.GetDocumentsPath);
{
$ENDIF}
Application.CreateForm(TMainFormMainForm);
Application.Run;
end.
///////////////////////////////////////////////////////////// 

extraemos estas librerias en la carpeta de nuestro proyecto por ejemplo:
https://forums.embarcadero.com/servl...%20Android.zip
y luego en el Deploy de nuestro proyectoañadimos las dos librerias libssl.so y libcrypto.so
Project -> Deployment -> All Configurations -> android platform -> Add file -> select your libraries
y en e path de cada una le ponemos: .\assets\internal\

Casimiro Notevi 12-01-2020 10:03:20

¿Y qué tiene que ver esto con la pregunta inicial del hilo?

cocute 12-01-2020 15:43:19

Cita:

Empezado por Casimiro Notevi (Mensaje 535173)
¿Y qué tiene que ver esto con la pregunta inicial del hilo?

es que al final la base del problema era esta, que no podía leer los ficheros XML por tema de las libreriasindy SSL

por lo que veo al menos para la última versión hay parche,
https://cc.embarcadero.com/Item/30906

MaxiDucoli 12-01-2020 19:10:34

Cita:

Empezado por xalo (Mensaje 535134)
No estoy seguro ahora si lleva la / inicial, ....pero pruébalo.



No entiendo la pregunta. Mira que recibes en xmlContent.

HTTPS lo solucionas con las librerías SSL
creo que eran ssl.so o algo así que tenés que ponerle.


La franja horaria es GMT +2. Ahora son las 09:14:16.

Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi