Retroceder   Foros del Web > Programación para sitios web > XML

Respuesta
 
Herramientas Desplegado
Antiguo 28-feb-2008, 02:59   #1 (permalink)
juanvivo ha deshabilitado el karma
 
Fecha de Ingreso: junio-2006
Mensajes: 46
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.
juanvivo está desconectado   Responder Citando
Antiguo 04-mar-2008, 01:45   #2 (permalink)
juanvivo ha deshabilitado el karma
 
Fecha de Ingreso: junio-2006
Mensajes: 46
Re: xpath para conseguir datos

Nadie me puede echar una mano?
juanvivo está desconectado   Responder Citando
Antiguo 04-mar-2008, 04:46   #3 (permalink)
$moderador{'Esteban'}
monoswim llegará a ser famoso muy prontomonoswim llegará a ser famoso muy pronto
 
Avatar de monoswim
 
Fecha de Ingreso: noviembre-2002
Ubicación: Buenos Aires - Argentina
Mensajes: 7.322
Enviar un mensaje por MSN a monoswim
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
__________________
MonoSwim

Antes era fanfarrón y canchero, ahora soy perfecto !!!!!!!
monoswim está desconectado   Responder Citando
Antiguo 04-mar-2008, 08:29   #4 (permalink)
juanvivo ha deshabilitado el karma
 
Fecha de Ingreso: junio-2006
Mensajes: 46
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...
juanvivo está desconectado   Responder Citando
Antiguo 04-mar-2008, 09:42   #5 (permalink)
aloqui tiene algunos puntos positivos de karma
 
Avatar de aloqui
 
Fecha de Ingreso: diciembre-2007
Mensajes: 952
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>
aloqui está desconectado   Responder Citando
Antiguo 04-mar-2008, 09:45   #6 (permalink)
juanvivo ha deshabilitado el karma
 
Fecha de Ingreso: junio-2006
Mensajes: 46
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...
juanvivo está desconectado   Responder Citando
Antiguo 04-mar-2008, 09:52   #7 (permalink)
aloqui tiene algunos puntos positivos de karma
 
Avatar de aloqui
 
Fecha de Ingreso: diciembre-2007
Mensajes: 952
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"
aloqui está desconectado   Responder Citando
Antiguo 04-mar-2008, 12:07   #8 (permalink)
juanvivo ha deshabilitado el karma
 
Fecha de Ingreso: junio-2006
Mensajes: 46
Re: xpath para conseguir datos

Gracias, voy a ver... ;)
juanvivo está desconectado   Responder Citando
Antiguo 05-mar-2008, 07:42   #9 (permalink)
juanvivo ha deshabilitado el karma
 
Fecha de Ingreso: junio-2006
Mensajes: 46
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-mar-2008 a las 08:03.
juanvivo está desconectado   Responder Citando
Antiguo 05-mar-2008, 09:22   #10 (permalink)
aloqui tiene algunos puntos positivos de karma
 
Avatar de aloqui
 
Fecha de Ingreso: diciembre-2007
Mensajes: 952
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)
aloqui está desconectado   Responder Citando
Antiguo 05-mar-2008, 09:41   #11 (permalink)
juanvivo ha deshabilitado el karma
 
Fecha de Ingreso: junio-2006
Mensajes: 46
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.
juanvivo está desconectado   Responder Citando
Antiguo 05-mar-2008, 10:31   #12 (permalink)
aloqui tiene algunos puntos positivos de karma
 
Avatar de aloqui
 
Fecha de Ingreso: diciembre-2007
Mensajes: 952
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.
aloqui está desconectado   Responder Citando
Antiguo 05-mar-2008, 10:44   #13 (permalink)
juanvivo ha deshabilitado el karma
 
Fecha de Ingreso: junio-2006
Mensajes: 46
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...
juanvivo está desconectado   Responder Citando
Antiguo 05-mar-2008, 10:52   #14 (permalink)
aloqui tiene algunos puntos positivos de karma
 
Avatar de aloqui
 
Fecha de Ingreso: diciembre-2007
Mensajes: 952
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.
aloqui está desconectado   Responder Citando
Antiguo 05-mar-2008, 21:50   #15 (permalink)
Moderador
GatorV llegará a ser famoso muy prontoGatorV llegará a ser famoso muy prontoGatorV llegará a ser famoso muy prontoGatorV llegará a ser famoso muy prontoGatorV llegará a ser famoso muy pronto
 
Avatar de GatorV
 
Fecha de Ingreso: mayo-2006
Ubicación: Queretaro, Mexico
Mensajes: 11.600
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.
__________________
Blog Web
GatorV está desconectado   Responder Citando
Antiguo 06-mar-2008, 02:38   #16 (permalink)
juanvivo ha deshabilitado el karma
 
Fecha de Ingreso: junio-2006
Mensajes: 46
Re: xpath para conseguir datos

Ya lo uso.
juanvivo está desconectado   Responder Citando
Antiguo 06-mar-2008, 04:24   #17 (permalink)
juanvivo ha deshabilitado el karma
 
Fecha de Ingreso: junio-2006
Mensajes: 46
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...
juanvivo está desconectado   Responder Citando
Respuesta
Calificación: Calificación de Tema: 1 votos, 5,00 de promedio.


Herramientas
Desplegado

Normas de Publicación
No puedes crear nuevos temas
No puedes responder temas
No puedes subir archivos adjuntos
No puedes editar tus mensajes

BB code is Activado
Caritas están Activado
[IMG] está Activado
Código HTML está Desactivado


La Zona horaria es GMT -6. Ahora son las 04:41.


Message Board Statistics

LinkBacks Enabled by vBSEO 3.1.0

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93