Foros del Web » Programación para mayores de 30 ;) » Programación General »

xpath para conseguir datos

Estas en el tema de xpath para conseguir datos en el foro de Programación General en Foros del Web. Hola a todos! Comence un post en el foro de PHP y alli nos hemos quedado atascados... A ver si aqui hay mas suerte, ya ...
  #1 (permalink)  
Antiguo 28/02/2008, 03:59
 
Fecha de Ingreso: junio-2006
Mensajes: 46
Antigüedad: 18 años, 5 meses
Puntos: 0
xpath para conseguir datos

Hola a todos!

Comence un post en el foro de PHP y alli nos hemos quedado atascados... A ver si aqui hay mas suerte, ya que el XML es el tema central de la duda... ;)

Tengo un codigo XML que os muestro abajo y del que tengo que extraer datos con php.

Código:
<vpt la=1 lo=2>
	<name></name>
	<car></car>
	<gpk:logs>
        	<gpk:log id="39146139">
          		<gpk:date>fecha</gpk:date>
          		<gpk:type>perfecto</gpk:type>
          		<gpk:fin id="1">nombre</gpk:fin>
          		<gpk:text encoded="False">texto 1</gpk:text>
        	</gpk:log>
        	<gpk:log id="34860048">
          		<gpk:date>fecha2</gpk:date>
          		<gpk:type>perfecto</gpk:type>
          		<gpk:fin id="2">nombre2</gpk:fin>
          		<gpk:text encoded="False">Texto2</gpk:text>
        	</gpk:log>
	</gpk:logs>
</vpt>
<vpt la=3 lo=4>
	<name></name>
	<car></car>
	<gpk:logs>
        	<gpk:log id="39149856">
          		<gpk:date>fecha3</gpk:date>
          		<gpk:type>perfecto</gpk:type>
          		<gpk:fin id="3">nombre3</gpk:fin>
          		<gpk:text encoded="False">texto 3</gpk:text>
        	</gpk:log>
        	<gpk:log id="34863261">
          		<gpk:date>fecha4</gpk:date>
          		<gpk:type>perfecto</gpk:type>
          		<gpk:fin id="4">nombre4</gpk:fin>
          		<gpk:text encoded="False">Texto4</gpk:text>
        	</gpk:log>
	</gpk:logs>
</vpt>
Este es el codigo verdadero. Yo necesito mostrar solo los datos que hay entre las etiquetas <gpk:logs></gpk:logs>, pero solo las del primer <vpt>. El problema que tengo es que hago un bucle siguiendo las pistas que me habeis ido dando para mostrarlos asi, por mostraros una de las formas que he probado:

Código:
        	$etiquetas = $xml->xpath( "//c:log" );
		$numero = count ($etiquetas);
		
                for ( $i = 0 ; $i <= $numero ; $i ++){
                
               $ldate = $xml->xpath('//c:date');
	       echo $ldate[$i].'</br>';
Pero esto en vez de mostrarme los date de solo el <gpk:logs> de la primera etiqueta (<vpt la=1 lo=2>) me muestra todos los que hay en todas las etiquetas (fecha1,fecha2,fecha3,fecha4...etc)

Como puedo hacerlo para que solo me devuelva fecha1 y fecha 2 que son los que estan dentro de las primeras <gpk:logs>?

En el otro foro me dicen que juegue con el xpath hasta dar con el bueno que solo me muestre los datos del primer <gpk:logs></gpk:logs>, pero no tengo ni idea de la sintexis de estos querys... Podeis echarme una mano??

MUchisimas gracias por vuestra ayuda.
  #2 (permalink)  
Antiguo 04/03/2008, 02:45
 
Fecha de Ingreso: junio-2006
Mensajes: 46
Antigüedad: 18 años, 5 meses
Puntos: 0
Re: xpath para conseguir datos

Nadie me puede echar una mano?
  #3 (permalink)  
Antiguo 04/03/2008, 05:46
Avatar de monoswim
$moderador{'Esteban'}
 
Fecha de Ingreso: febrero-2002
Ubicación: Buenos Aires - Argentina
Mensajes: 8.762
Antigüedad: 22 años, 9 meses
Puntos: 90
Re: xpath para conseguir datos

A ver si entiendo, el XML es correcto y sobre el no tienes ninguna duda, tu duda es como mostrar los datos mediante PHP, pues tienes que preguntar en PHP, pero dices que ya lo hiciste...

Bien, ahora dices que te salen todas las fechas pero tu necesitas solamente la primera ?

en vez del bucle puedes hacer esto

echo $ldate[1].'</br>';

así no te mostrará todas, sino la primera ( en verdad de be ser 0 no 1, checkealo)

Espero que te sirva

Saludos
__________________
Esteban Quintana
  #4 (permalink)  
Antiguo 04/03/2008, 09:29
 
Fecha de Ingreso: junio-2006
Mensajes: 46
Antigüedad: 18 años, 5 meses
Puntos: 0
Re: xpath para conseguir datos

En php me dijeron qque preguntara aqui...

No es la primera la que quiero, si no las que hay en el primer <gpk:logs>
, en este caso, fecha1 y fecha2...

Gracias no obstante por tu respuesta... A ver si lo soluciono pronto que llevo ya muchos dias...
  #5 (permalink)  
Antiguo 04/03/2008, 10:42
Avatar de aloqui  
Fecha de Ingreso: diciembre-2007
Mensajes: 973
Antigüedad: 16 años, 11 meses
Puntos: 24
Re: xpath para conseguir datos

Si lo que quieres es el el primer <gpk:logs>, la sentencia XPath es: "//gpk:logs[position()=1]"

Si lo que quieres es el <gpk:logs> de la primera etiqueta <vpt>, la sentencia XPath es: "/nodos_de_niveles_anteriores/vpt[position()=1]/gpk:logs"

Estoy suponiendo que el XML está definido correctamente con un namespace para el prefijo "gpk". Algo así como, el prefijo "aws" que usa Amazon:
Código:
<?xml version="1.0" encoding="UTF-8"?>
<ItemLookupResponse xmlns="http://webservices.amazon.com/AWSECommerceService/2007-01-15">
...
</ItemLookupResponse>
__________________
Grupos de Música
Pop Music Stars
  #6 (permalink)  
Antiguo 04/03/2008, 10:45
 
Fecha de Ingreso: junio-2006
Mensajes: 46
Antigüedad: 18 años, 5 meses
Puntos: 0
Re: xpath para conseguir datos

Lo que quiero son los contenidos de las etiquetas <gpk:log>, que estan dentro de la etiqueta <gpk:logs>. Esta a su vez esta dentro de <vpt>. Pero solo las del primer <vpt>, no los siguientes...

A ver probando con las sintaxis estas que me das...
  #7 (permalink)  
Antiguo 04/03/2008, 10:52
Avatar de aloqui  
Fecha de Ingreso: diciembre-2007
Mensajes: 973
Antigüedad: 16 años, 11 meses
Puntos: 24
Re: xpath para conseguir datos

Cita:
Iniciado por juanvivo Ver Mensaje
Lo que quiero son los contenidos de las etiquetas <gpk:log>, que estan dentro de la etiqueta <gpk:logs>. Esta a su vez esta dentro de <vpt>. Pero solo las del primer <vpt>, no los siguientes...
Entonces la sentencia XPath a usar es:
"/nodos_de_niveles_anteriores/vpt[position()=1]/gpk:logs/gpk:log"
__________________
Grupos de Música
Pop Music Stars
  #8 (permalink)  
Antiguo 04/03/2008, 13:07
 
Fecha de Ingreso: junio-2006
Mensajes: 46
Antigüedad: 18 años, 5 meses
Puntos: 0
Re: xpath para conseguir datos

Gracias, voy a ver... ;)
  #9 (permalink)  
Antiguo 05/03/2008, 08:42
 
Fecha de Ingreso: junio-2006
Mensajes: 46
Antigüedad: 18 años, 5 meses
Puntos: 0
Re: xpath para conseguir datos

No consigo que me devuelva lo que quiero...

Hay un problema. Antes de devolver los datos canta un error:

Warning: SimpleXMLElement::xpath() [function.SimpleXMLElement-xpath]: Undefined namespace prefix in C:\Program Files\xampp\htdocs\pagina\index.php on line 124

la linea 124 quedo asi:

$etiquetas = $xml->xpath( "/vpt[position()=1]/gpk:logs/gpk:log" );

he probado a añadir nodos anteriores hasta la misma base del xml, pero nada...

Hay algun codigo que me muestre los distintos xpath que tiene un xml??? para asi asegurar que estoy poniendo el correcto... Algo visual.

Última edición por juanvivo; 05/03/2008 a las 09:03
  #10 (permalink)  
Antiguo 05/03/2008, 10:22
Avatar de aloqui  
Fecha de Ingreso: diciembre-2007
Mensajes: 973
Antigüedad: 16 años, 11 meses
Puntos: 24
Re: xpath para conseguir datos

Cita:
Iniciado por juanvivo Ver Mensaje
No consigo que me devuelva lo que quiero...

Hay un problema. Antes de devolver los datos canta un error:

Warning: SimpleXMLElement::xpath() [function.SimpleXMLElement-xpath]: Undefined namespace prefix in C:\Program Files\xampp\htdocs\pagina\index.php on line 124
Probablemente es porque el prefijo "gpk" no lo tienes bien definido en el XML.
Mira el post #5 en el que puse un ejemplo de como son los XML de Amazon.


Si tienes alguna clase de UNIX o LINUX, puedes validar tu documento XML con el comando xmlwf. Si no, tambien puedes hacerlo en ésta página: http://www.w3schools.com/dom/dom_validate.asp

Cita:
Iniciado por juanvivo Ver Mensaje
Hay algun codigo que me muestre los distintos xpath que tiene un xml??? para asi asegurar que estoy poniendo el correcto... Algo visual.
Puedes intentarlo con alguna utilidad como las siguientes:
Free XPath Query Tool (online)
Visual Xpath (no online)
__________________
Grupos de Música
Pop Music Stars
  #11 (permalink)  
Antiguo 05/03/2008, 10:41
 
Fecha de Ingreso: junio-2006
Mensajes: 46
Antigüedad: 18 años, 5 meses
Puntos: 0
Re: xpath para conseguir datos

El visual xpath me funciono, el otro no supe usarlo. Al seleccionar la etiqueta, me da este xpath (para el log1 del logs del primer vpt):

Código:
/def:gpx/def:vpt[1]/gpk:cach/gpk:logs/gpk:log[1]
pero igualmente lo he introducido en mi codigo y sigue saltando error Warning: SimpleXMLElement::xpath() [function.SimpleXMLElement-xpath]: Undefined namespace prefix in ...

He validado el codigo en la direccion web que me diste y no hay errores.
  #12 (permalink)  
Antiguo 05/03/2008, 11:31
Avatar de aloqui  
Fecha de Ingreso: diciembre-2007
Mensajes: 973
Antigüedad: 16 años, 11 meses
Puntos: 24
Re: xpath para conseguir datos

Pues el error dice que el problema está en un namespace no definido.
Si puedes modificar el XML, una alternativa es no utilizar namespaces; es decir, elimina todos prefijos "gpk:", "def:", ... de tu fichero XML.
__________________
Grupos de Música
Pop Music Stars
  #13 (permalink)  
Antiguo 05/03/2008, 11:44
 
Fecha de Ingreso: junio-2006
Mensajes: 46
Antigüedad: 18 años, 5 meses
Puntos: 0
Re: xpath para conseguir datos

La cosa es que no es mi fichero.

Lo que estoy intentado es convertir un archivo externo . Yo no me manejo nada con xml, por lo que lo que quiero pasar la info a mysql, y para eso es lo que ando luchando.

estoy cogiendo los datos de cada etiqueta para pasarlos a mi base de datos.

Por eso, si supiese como quitar los namespaces, no tendria ningun problema...
  #14 (permalink)  
Antiguo 05/03/2008, 11:52
Avatar de aloqui  
Fecha de Ingreso: diciembre-2007
Mensajes: 973
Antigüedad: 16 años, 11 meses
Puntos: 24
Re: xpath para conseguir datos

Creo que aunque el XML pase la validación no está bien definido.
Lo unico que se me ocurre, aunque es un poco chapuza, es que copies el XML en tu servidor, luego le quitas los namespaces, lo utilizas para guardar las etiquetas deseadas en tu BBDD y luego lo borras.
__________________
Grupos de Música
Pop Music Stars
  #15 (permalink)  
Antiguo 05/03/2008, 22:50
Avatar de GatorV
$this->role('moderador');
 
Fecha de Ingreso: mayo-2006
Ubicación: /home/ams/
Mensajes: 38.567
Antigüedad: 18 años, 6 meses
Puntos: 2135
Re: xpath para conseguir datos

Hola Juanvivo,

Recuerda en el POST primero en el foro de PHP, te comente que debías de usar SimpleXMLElement::registerXPathNamespace, si no, no podrás realizar el xpath que quieres usar.

Saludos.
  #16 (permalink)  
Antiguo 06/03/2008, 03:38
 
Fecha de Ingreso: junio-2006
Mensajes: 46
Antigüedad: 18 años, 5 meses
Puntos: 0
Re: xpath para conseguir datos

Ya lo uso.
  #17 (permalink)  
Antiguo 06/03/2008, 05:24
 
Fecha de Ingreso: junio-2006
Mensajes: 46
Antigüedad: 18 años, 5 meses
Puntos: 0
Re: xpath para conseguir datos

Pues al final creo que he encontrado una solucion, poco ortodoxa pero solucion...

Me voy a cargar todos los namespaces, simplemente haciendo una pequeña aplicacion que sustituya en el fichero el texto gpk:log , por ejemplo, por gpklog , y de esta manera lo tomara como una etiqueta normal, no??? y esto no creo que afecte al resultado final...
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta

SíEste tema le ha gustado a 1 personas




La zona horaria es GMT -6. Ahora son las 23:03.