Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   OOP (https://www.clubdelphi.com/foros/forumdisplay.php?f=5)
-   -   buscar el valor de un nodo en un TXMLDocument (https://www.clubdelphi.com/foros/showthread.php?t=54316)

fcios 14-03-2008 04:47:40

buscar el valor de un nodo en un TXMLDocument
 
tengo por ejemplo

<login>
__<header>
____<source>wsaa</source>
____<destination>SERIALNUMBER</destination>
__</header>
__<credentials>
____<token>PD94</token>
____<sign>ASepk</sign>
__</credentials>
</login>

por ejemplo el nodo source es único como puedo buscar el valor de ese nodo sin tener que entrar a hacer algo como

ixmlRoot := XMLDoc.DocumentElement;
ixmlHeader := ixmlRoot.ChildNodes.FindNode('header');
ixmlSource := ixmlHeader.ChildNodes.FindNode('source');
sSource := ixmlSource.Text;

probé esto pero no trae nada
raiz := FDocXml.DocumentElement.ChildNodes.FindNode('source');

¿ hay alguna forma de buscar un nodo y directamente me devuelva el valor ?

Ya te doy las Gracias

dec 14-03-2008 10:45:16

Hola,

Hasta donde yo llego no podrás hacer lo que quieres, esto es, para buscar, tendrás que mirar en los nodos oportunos. Es decir, esta instrucción:

Código Delphi [-]
raiz := FDocXml.DocumentElement.ChildNodes.FindNode('source');

No funciona, porque estás buscando el nodo "source" entre los nodos hijos de la raíz del documento XML, pero, "source" está dentro del nodo "header".

En definitiva, no podrás hacer lo que quieres, ya digo, hasta donde yo llego, pero, nada te impide fabricarte una función o procedimiento que "busque" en el XML, aunque esto pase por recorrer todos sus nodos, al menos hasta encontrar aquello que se busca.

fcios 17-03-2008 14:55:45

Hola Dec y gracias, bueno acá está mi solución

Código Delphi [-]
function TForm1.BuscoValorDelNodo(XMLDoc:TXMLDocument;sNodoABuscar:string):{wide}String;
// Busca el 1er valor del nodo sNodoABuscar
var n,n2,nLongNodo:integer;
begin
  n:=Pos('<'+sNodoABuscar+'>',XMLDoc.XML.Text);
  if n = 0 then begin
    Result := '';
    Exit;
  end;
  nLongNodo:= Length(snodoABuscar) + 2;
  // busco desde donde empieza el nodo
  n2:=PosEx('+sNodoABuscar+'>',XMLDoc.XML.Text,n);
  Result := MidStr(XMLDoc.XML.Text,n+nLongNodo,n2-n-nLongNodo);
end;

farute 30-01-2018 09:34:31

hola estoy intentando sacar los valores de este xml
Cita:

<?xml version="1.0" encoding="utf-8" ?>
<current_observation>
<image>
</image>
<location>
<elevation>2579 ft</elevation>
</location>
<station_type>other</station_type>
<observation_time>Last Updated on January 30, 9:17 AM CET</observation_time>
<observation_time_rfc822>Tue, 30 Jan 2018 08:17:42 GMT</observation_time_rfc822>
<weather></weather>
<temperature_string>31.8 F (-0.1 C)</temperature_string>
<temp_f>31.8</temp_f>
<temp_c>-0.1</temp_c>
</current_observation>


pero sólo lo consigo con algunos con otros no.

por ejemplo con esto si quiero sacar la <elevation> que está en <location> la saco sin problemas:
Código Delphi [-]
var
    StartItemNode : IXMLNode;
begin
   XMLDoc.FileName := 'http://api.wunderground.com/weatherstation/WXCurrentObXML.asp?ID=IVILLAQU3';
   XMLDoc.Active:=True;

   StartItemNode := XMLDoc.DocumentElement.ChildNodes.FindNode('location') ;
label3.Text:=  StartItemNode.childNodes['elevation'].Text;
end;

pero como quiera sacar otros valores de fuera de location como por ejemplo el "temp_c" no hay manera, no funcionan

farute 30-01-2018 09:41:55

vale ya lo he conseguido con
Código Delphi [-]
 StartItemNode := XMLDoc.DocumentElement.ChildNodes.FindNode('temp_c') ;
label3.Text:=  StartItemNode.Text;

farute 07-02-2018 13:32:12

ahora el problema que me encuentro es que no funciona en una aplicación android,
no entiendo el por que,
no da error pero no hace nada.
si compilo en windows funciona y si compilo en android no coge datos.

alguno sabe que puede pasar.?

gracias


La franja horaria es GMT +2. Ahora son las 14:07:24.

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