Foros del Web » Programando para Internet » PHP »

xpath no me funciona

Estas en el tema de xpath no me funciona en el foro de PHP en Foros del Web. Hola!!, Quiero acceder a nodos internos de un xml, y por lo que he leído la instrucción Xpath de SimpleXMLElement sirve para eso, el detalle ...
  #1 (permalink)  
Antiguo 24/08/2010, 16:18
 
Fecha de Ingreso: marzo-2002
Mensajes: 299
Antigüedad: 22 años
Puntos: 1
xpath no me funciona

Hola!!,

Quiero acceder a nodos internos de un xml, y por lo que he leído la instrucción Xpath de SimpleXMLElement sirve para eso, el detalle es que tengo un ejemplo y funciona adecuadamente:

Esta es la estructura para el ejemplo:

Código XML:
Ver original
  1. <?php
  2. $xmlstr = <<<XML
  3. <?xml version='1.0' standalone='yes'?>
  4. <movies>
  5. <movie>
  6.   <id>1</id>
  7.   <title>PHP: Behind the Parser</title>
  8.   <characters>
  9.    <character>
  10.     <name>Ms. Coder</name>
  11.     <actor>Onlivia Actora</actor>
  12.    </character>
  13.    <character>
  14.     <name>Mr. Coder</name>
  15.     <actor>El ActÓr</actor>
  16.    </character>
  17.   </characters>
  18.   <plot>
  19.    So, this language. It's like, a programming language. Or is it a
  20.    scripting language? All is revealed in this thrilling horror spoof
  21.    of a documentary.
  22.   </plot>
  23.   <rating type="thumbs">7</rating>
  24.   <rating type="stars">5</rating>
  25. </movie>
  26. <movie>
  27.   <id>2</id>
  28.   <title>PHP: Behind the Parser</title>
  29.   <characters>
  30.    <character>
  31.     <name>Ms. Coder</name>
  32.     <actor>Onlivia Actora</actor>
  33.    </character>
  34.    <character>
  35.     <name>Mr. Coder</name>
  36.     <actor>El ActÓr</actor>
  37.    </character>
  38.   </characters>
  39.   <plot>
  40.    So, this language. It's like, a programming language. Or is it a
  41.    scripting language? All is revealed in this thrilling horror spoof
  42.    of a documentary.
  43.   </plot>
  44.   <rating type="thumbs">7</rating>
  45.   <rating type="stars">5</rating>
  46. </movie>
  47. </movies>
  48. XML;
  49. ?>

Este es el código donde se aplica la instrucción Xpath:

Código PHP:
Ver original
  1. <?php
  2. include 'ejemplo.php';
  3. $xml = simplexml_load_string($xmlstr);
  4.  
  5. foreach ($xml->xpath('//character') as $itemcharacter) {
  6.     echo $itemcharacter->name, 'played by ', $itemcharacter->actor, '<br />';
  7. }
  8. ?>

Cuando lo quiero aplicar a mi estructura XML, no funciona, no muestra nada, se queda en blanco.

la estructura del XML es:

Código XML:
Ver original
  1. <?xml version="1.0" encoding="utf-8" ?>
  2.  <QuoteHotels xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  3.  
  4. xmlns="http://tempuri.org/xml/enginexml_agencies">
  5.  <hotels>
  6.  <hotel>
  7.   <hotelid>1826</hotelid>
  8.   <hotelname>Antiguo Mesón de Aspeytia</hotelname>
  9.   <cityid>QRO</cityid>
  10.   <cityname>Querétaro - Ciudad</cityname>
  11.   <roomtype>SGL1QN</roomtype>
  12.   <roomtypename>Sencilla 1 cama Queen</roomtypename>
  13.   <mealplan>EP,EP,EP</mealplan>
  14.   <mealplanname>Sólo Habitación</mealplanname>
  15.   <codigo_aeropuerto>QRO</codigo_aeropuerto>
  16.  <roomtypedetails>
  17.   <maxadults>2</maxadults>
  18.   <maxkids>0</maxkids>
  19.   <maxextras>0</maxextras>
  20.   <maxpersons>2</maxpersons>
  21.   <kidsagefrom>0</kidsagefrom>
  22.   <kidsageto>0</kidsageto>
  23.   <juniorsagefrom>0</juniorsagefrom>
  24.   <juniorsageto>0</juniorsageto>
  25.   <roomview>Vista a la calle</roomview>
  26.   <bedding>1 cama Queen size</bedding>
  27.   </roomtypedetails>
  28.  <rooms>
  29.  <Roomrates>
  30.   <roomtype>SGL1QN</roomtype>
  31.   <roomtypename>Sencilla 1 cama Queen</roomtypename>
  32.   <rate>4066.74439872</rate>
  33.   <rate_public>4733.9230590831</rate_public>
  34.   <Promosaving>0</Promosaving>
  35.   <isPromo>N</isPromo>
  36.   <mealplan>EP</mealplan>
  37.   <mealplanname>Sólo Habitación</mealplanname>
  38.   <room_num>1</room_num>
  39.   <State>Z</State>
  40.   </Roomrates>
  41.  <Roomrates>
  42.   <roomtype>SGL1QN</roomtype>
  43.   <roomtypename>Sencilla 1 cama Queen</roomtypename>
  44.   <rate>4066.74439872</rate>
  45.   <rate_public>4733.9230590831</rate_public>
  46.   <Promosaving>0</Promosaving>
  47.   <isPromo>N</isPromo>
  48.   <mealplan>EP</mealplan>
  49.   <mealplanname>Sólo Habitación</mealplanname>
  50.   <room_num>2</room_num>
  51.   <State>Z</State>
  52.   </Roomrates>
  53.  <Roomrates>
  54.   <roomtype>SGL1QN</roomtype>
  55.   <roomtypename>Sencilla 1 cama Queen</roomtypename>
  56.   <rate>4066.74439872</rate>
  57.   <rate_public>4733.9230590831</rate_public>
  58.   <Promosaving>0</Promosaving>
  59.   <isPromo>N</isPromo>
  60.   <mealplan>EP</mealplan>
  61.   <mealplanname>Sólo Habitación</mealplanname>
  62.   <room_num>3</room_num>
  63.   <State>Z</State>
  64.   </Roomrates>
  65.   </rooms>
  66.   <categoryid>S35</categoryid>
  67.   <ubicationid>Ciudad</ubicationid>
  68.   <destinationid>Querétaro</destinationid>
  69.   <rate>12200.23319616</rate>
  70.   <rate_public>14201.7691772493</rate_public>
  71.   <isrequote>N</isrequote>
  72.   <haspackage>Y</haspackage>
  73.   <state>Z</state>
  74.   <ispromo>N</ispromo>
  75.   <promo />
  76.   <promosaving>0</promosaving>
  77.   <terms />
  78.   <error />
  79.   </hotel>
  80.   </hotels>  
  81.   </QuoteHotels>

llego a esta estructura mediante file_get_contents, el codigo es el siguiente:

Código PHP:
Ver original
  1. <?php
  2. $llamada_ws=file_get_contents("http://xml.travel.com/enginexml.asmx/getQuoteHotels?r1k2a=-1&r1k3a=-1&r2a=11&r4k2a=-1&r4k3a=-1&des=40&l=ESP&co=MX");
  3.  
  4. $xml=new SimpleXMLElement($llamada_ws);
  5. foreach ($xml->xpath('//Roomrates') as $itemroom) {
  6.     echo $itemroom->roomtype,'<br />';
  7. }
  8. ?>

Desde ya gracias por su atención y ayuda.
  #2 (permalink)  
Antiguo 24/08/2010, 16:23
Avatar de pateketrueke
Modernizr
 
Fecha de Ingreso: abril-2008
Ubicación: Mexihco-Tenochtitlan
Mensajes: 26.399
Antigüedad: 15 años, 11 meses
Puntos: 2534
Respuesta: xpath no me funciona

supongo que comprendes la sintaxis de xPath, ¿verdad?

osea... sigo imaginando que te diste un tiempo para estudiarla, ¿cierto?

o bien, ¿que te dice el manual al respecto? ¿leíste alguna referencia? ¿ejemplos?


porque finalmente tu problema tiene que ver con dicha sintaxis de xPath y no con PHP, al menos no hasta este punto...
__________________
Y U NO RTFM? щ(ºдºщ)

No atiendo por MP nada que no sea personal.
  #3 (permalink)  
Antiguo 24/08/2010, 16:35
 
Fecha de Ingreso: marzo-2002
Mensajes: 299
Antigüedad: 22 años
Puntos: 1
Respuesta: xpath no me funciona

Gracias pateketrueke,

Si, estuve investigando sobre esta y sobre children, pero children solamente me devuelve el número de nodos y a recomendación tuya en otro post seguí esta que es Xpath y estuve checando varios ejemplos, la sintaxis según yo es correcta, puesto que si funciona en el primer ejemplo.
  #4 (permalink)  
Antiguo 24/08/2010, 16:44
Avatar de pateketrueke
Modernizr
 
Fecha de Ingreso: abril-2008
Ubicación: Mexihco-Tenochtitlan
Mensajes: 26.399
Antigüedad: 15 años, 11 meses
Puntos: 2534
Respuesta: xpath no me funciona

bueno, definitivamente la clave esta en el XML, la forma en que lo cargas y claro, la sintaxis xPath empleada...

aquí hay un enlace que espero te ayude de algo, o bien, espera a que alguien con mas experiencia al respecto de XML/xPath colabore en el tema...

http://www.w3schools.com/xpath/default.asp
__________________
Y U NO RTFM? щ(ºдºщ)

No atiendo por MP nada que no sea personal.
  #5 (permalink)  
Antiguo 24/08/2010, 16:56
 
Fecha de Ingreso: marzo-2002
Mensajes: 299
Antigüedad: 22 años
Puntos: 1
Respuesta: xpath no me funciona

ok, muchas gracias, checo el enlace y sigo esperando haber si alguien más me puede ayudar.

Gracias pateketrueke.
  #6 (permalink)  
Antiguo 24/08/2010, 17:48
Avatar de HackmanC  
Fecha de Ingreso: enero-2008
Ubicación: Guatemala
Mensajes: 1.817
Antigüedad: 16 años, 1 mes
Puntos: 260
Sonrisa Respuesta: xpath no me funciona

Hola,

Al parecer es un XML generado desde un DataSet en un WebService de .NET.
.NET tiene la particularidad de agregar el Namespace tempuri.org a los Datasets.

Código XML:
Ver original
  1. <?xml version="1.0" encoding="utf-8" ?>
  2.  <QuoteHotels xmlns:xsd="http://www.w3.org/2001/XMLSchema"
  3. xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  4. xmlns="http://tempuri.org/xml/enginexml_agencies">
  5.  <hotels>
  6. ...

Posiblemente tendrías que especificar el Namespace al cual se va a aplicar el xpath,

Código:
<?php
$llamada_ws=file_get_contents("http://xml.travel.com/enginexml.asmx/getQuoteHotels?r1k2a=-1&r1k3a=-1&r2a=11&r4k2a=-1&r4k3a=-1&des=40&l=ESP&co=MX");

$xml=new SimpleXMLElement($llamada_ws);
$xml->registerXPathNamespace('c', 'http://tempuri.org/xml/enginexml_agencies');
foreach ($xml->xpath('//c:Roomrates') as $itemroom) {
    echo $itemroom->roomtype,'<br />';
}
?>
Saludos,
  #7 (permalink)  
Antiguo 24/08/2010, 17:52
 
Fecha de Ingreso: marzo-2002
Mensajes: 299
Antigüedad: 22 años
Puntos: 1
Respuesta: xpath no me funciona

ok, gracias HackmanC

Voy a poner en práctica tu recomendación.

Saludos
  #8 (permalink)  
Antiguo 24/08/2010, 17:59
 
Fecha de Ingreso: marzo-2002
Mensajes: 299
Antigüedad: 22 años
Puntos: 1
Respuesta: xpath no me funciona

HackmanC si, funciona perfecto!!, muchas muchas gracias!!, la verdad es que no encontraba nada, me la he pasado días y nada y andaba perdida, muy perdida.

Muchas gracias!!
  #9 (permalink)  
Antiguo 25/08/2010, 11:49
 
Fecha de Ingreso: marzo-2002
Mensajes: 299
Antigüedad: 22 años
Puntos: 1
Respuesta: xpath no me funciona

Hola!!, nuevamente acudo a ustedes porque estoy enredada, ya que HackmanC me ayudó a como obtener los nodos internos, ahora no puedo obtener el idhotel del que dependen esos nodos internos, alguien sabe como puedo obtener tanto nodos externos como internos??, porque de momento lo tengo por separado, pero no sé como hacer la unión para determinar los nodos Roomrates a que hotelid corresponde.

Desde ya muchas gracias!!
  #10 (permalink)  
Antiguo 25/08/2010, 16:00
Avatar de HackmanC  
Fecha de Ingreso: enero-2008
Ubicación: Guatemala
Mensajes: 1.817
Antigüedad: 16 años, 1 mes
Puntos: 260
Sonrisa Respuesta: xpath no me funciona

Hola,

Creo que no es posible buscar el 'parent' una vez que se aplicó el xpath.
Tendrías que filtrar con xpath todos los hoteles e ir buscando con 'children'.

Aunque posiblemente puedas usar un xpath anidado,
va a depender completamente de lo que quieras lograr,

Código PHP:
Ver original
  1. <?php
  2. $llamada_ws=file_get_contents("http://xml.travel.com/enginexml.asmx/getQuoteHotels?r1k2a=-1&r1k3a=-1&r2a=11&r4k2a=-1&r4k3a=-1&des=40&l=ESP&co=MX");
  3.  
  4. $xml=new SimpleXMLElement($llamada_ws);
  5. $xml->registerXPathNamespace('c', 'http://tempuri.org/xml/enginexml_agencies');
  6. foreach ($xml->xpath('//c:hotel') as $itemroom) {
  7.     $xml2 = new SimpleXMLElement($itemroom->asXML());
  8.     foreach ($xml2->xpath('//Roomrates') as $itemroom2) {
  9.         echo $itemroom->hotelid . '-' . $itemroom2->roomtype,'<br />';
  10.     }
  11. }
  12. ?>

Saludos,

Etiquetas: Ninguno
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




La zona horaria es GMT -6. Ahora son las 10:09.