Foros del Web » Programando para Internet » PHP »

Xpath y acceso a XML's

Estas en el tema de Xpath y acceso a XML's en el foro de PHP en Foros del Web. Buenas amigos, Estoy teniendo algunos problemas para domar XPath. Soy principiante en el uso de esta herramienta y la verdad me estoy volviendo un poco ...
  #1 (permalink)  
Antiguo 29/01/2011, 15:51
 
Fecha de Ingreso: julio-2008
Mensajes: 15
Antigüedad: 15 años, 9 meses
Puntos: 0
Xpath y acceso a XML's

Buenas amigos,

Estoy teniendo algunos problemas para domar XPath. Soy principiante en el uso de esta herramienta y la verdad me estoy volviendo un poco loco...
Veréis, estoy desarrollando una clase que interactua con la API de google maps, éste me devuelve un XML del tipo:

Código:
  <?xml version="1.0" encoding="UTF-8" ?> 
- <kml xmlns="http://earth.google.com/kml/2.0">
- <Response>
<name>sagrada familia barcelona</name> - <Status> <code>200</code> <request>geocode</request> </Status> - <Placemark id="p1"> <address>Sagrada Familia de Barcelona, C/ MALLORCA, 401, 08013 Barcelona, España</address> - <AddressDetails Accuracy="9" xmlns="urn:oasis:names:tc:ciq:xsdschema:xAL:2.0"> - <Country> <CountryNameCode>ES</CountryNameCode> <CountryName>España</CountryName> - <SubAdministrativeArea> <SubAdministrativeAreaName>Barcelona</SubAdministrativeAreaName> - <Locality> <LocalityName>Barcelona</LocalityName> - <Thoroughfare> <ThoroughfareName>Templo de la Sagrada Familia, C/ MALLORCA, 401</ThoroughfareName> </Thoroughfare> - <PostalCode> <PostalCodeNumber>08013</PostalCodeNumber> </PostalCode> <AddressLine>Templo de la Sagrada Familia</AddressLine> </Locality> </SubAdministrativeArea> </Country> </AddressDetails> - <ExtendedData> <LatLonBox north="41.4117417" south="41.3950031" east="2.1899247" west="2.1579099" /> </ExtendedData> - <Point> <coordinates>2.1739173,41.4033729,0</coordinates> </Point> </Placemark>
</Response> </kml>
Y quiero acceder a algunos de esos nodos con el siguiente código php:
Código PHP:
        $xml simplexml_load_file($request_url);
        
$result $xml->xpath('code');
        
print_r($result); 
he intentado ya unas cuantas combinaciones con el xpath: 'code', '//Response/Status/code, ... pero siempre me devuelve que $result está vacío.

Alguien podría ayudarme ?

Gracias de antemano.
  #2 (permalink)  
Antiguo 29/01/2011, 15:58
Avatar de abimaelrc
Colaborador
 
Fecha de Ingreso: mayo-2009
Ubicación: En el planeta de Puerto Rico
Mensajes: 14.734
Antigüedad: 14 años, 11 meses
Puntos: 1517
Respuesta: Xpath y acceso a XML's

Te recomiendo que leas este material http://www.w3schools.com/XPath/xpath_syntax.asp
__________________
Verifica antes de preguntar.
Los verdaderos amigos se hieren con la verdad, para no perderlos con la mentira. - Eugenio Maria de Hostos
  #3 (permalink)  
Antiguo 29/01/2011, 16:44
 
Fecha de Ingreso: julio-2008
Mensajes: 15
Antigüedad: 15 años, 9 meses
Puntos: 0
Respuesta: Xpath y acceso a XML's

Gracias abimaelrc,
Ya me había leído algun manual similar a este... He estado probando pero sigo igual :(

He probado las combinaciones:

Código PHP:
 $result $xml->xpath('/Response/name');
        
var_dump($result);
        
$result $xml->xpath('//Response/name');
        
var_dump($result);
        
$result $xml->xpath('//name');
        
var_dump($result);
        
$result $xml->xpath('Response->name');
        
var_dump($result);
        
$result $xml->xpath('/kml/Response/name');
        
var_dump($result);
        
$result $xml->xpath('//kml/Response/name');
        
var_dump($result);
        
$result $xml->xpath('kml->Response->name');
        
var_dump($result); 
El resultado siempre es array(0) { }

He pensado también que lo mismo el $xml no tiene un valor compatible con el xpath, lo mismo debería aplicarle alguna transformación antes... no sé. Cuando hago un print_r($xml); me devuelve que es un SimpleXMLElement Object.

Cita:
SimpleXMLElement Object ( [Response] => SimpleXMLElement Object ( [name] => sagrada familia barcelona [Status] => SimpleXMLElement Object ( [code] => 200 [request] => geocode ) [Placemark] => SimpleXMLElement Object ( [@attributes] => Array ( [id] => p1 ) [address] => Sagrada Familia de Barcelona, C/ MALLORCA, 401, 08013 Barcelona, España [AddressDetails] => SimpleXMLElement Object ( [@attributes] => Array ( [Accuracy] => 9 ) [Country] => SimpleXMLElement Object ( [CountryNameCode] => ES [CountryName] => España [SubAdministrativeArea] => SimpleXMLElement Object ( [SubAdministrativeAreaName] => Barcelona [Locality] => SimpleXMLElement Object ( [LocalityName] => Barcelona [Thoroughfare] => SimpleXMLElement Object ( [ThoroughfareName] => Temple de la Sagrada Família, C/ MALLORCA, 401 ) [PostalCode] => SimpleXMLElement Object ( [PostalCodeNumber] => 08013 ) [AddressLine] => Templo de la Sagrada Familia ) ) ) ) [ExtendedData] => SimpleXMLElement Object ( [LatLonBox] => SimpleXMLElement Object ( [@attributes] => Array ( [north] => 41.4117417 [south] => 41.3950031 [east] => 2.1899247 [west] => 2.1579099 ) ) ) [Point] => SimpleXMLElement Object ( [coordinates] => 2.1739173,41.4033729,0 ) ) ) )
De todas formas gracias por la ayuda ;)
  #4 (permalink)  
Antiguo 30/01/2011, 00:35
Avatar de abimaelrc
Colaborador
 
Fecha de Ingreso: mayo-2009
Ubicación: En el planeta de Puerto Rico
Mensajes: 14.734
Antigüedad: 14 años, 11 meses
Puntos: 1517
Respuesta: Xpath y acceso a XML's

Tienes razón, de la única forma que pude ver el contenido es haciendo esto
Código PHP:
Ver original
  1. <?php
  2. $string = str_replace(' xmlns="http://earth.google.com/kml/2.0"','',file_get_contents('index.xml'));
  3. $xml = new SimpleXMLElement($string);
  4. print_r($xml->xpath('//name'));
Eliminando la parte que dice earth.google.com..... o puedes usarlo de esta forma
Código PHP:
Ver original
  1. <?php
  2. $string = file_get_contents('index.xml');
  3. $xml = new SimpleXMLElement($string);
  4. echo $xml->Response->name;
__________________
Verifica antes de preguntar.
Los verdaderos amigos se hieren con la verdad, para no perderlos con la mentira. - Eugenio Maria de Hostos
  #5 (permalink)  
Antiguo 30/01/2011, 06:12
 
Fecha de Ingreso: julio-2008
Mensajes: 15
Antigüedad: 15 años, 9 meses
Puntos: 0
Respuesta: Xpath y acceso a XML's

Muchas gracias abimaelrc :) Sin ti me hubiera sido imposible.

Comparto aquí el código de la función por si a alguien le sirve aunque pensaba publicar la clase entera cuando la tenga terminada, si alguien la necesita que me avise (es para codeigniter, pero no cuesta nada adaptarla).

Código PHP:
function locate() {
        
$base_url "http://maps.google.es/maps/geo?output=xml&key=" apiKey "&oe=utf8";
        
$query $this->getAddress() . " " $this->getCity() . " " $this->getPostalCode();
        
$request_url $base_url "&q=" urlencode($query); //construct http request
        
$strResponse file_get_contents($request_url);
        
$strResponse str_replace(' xmlns="http://earth.google.com/kml/2.0"'''$strResponse);
        
$xml = new SimpleXMLElement($strResponse);

        
$result $xml->xpath('//kml/Response/Placemark/Point/coordinates'); //also  $xml->xpath('//coordinates');
        
$coordinates explode(","$result[0]);
        
$arrayCoords = array("x" => $coordinates[0], "y" => $coordinates[1]);
        return(
$arrayCoords);
    } 

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 12:07.