1

I am trying to get to the geo information off the google-picasa API. This is the original XML:

<georss:where>
  <gml:Point>
    <gml:pos>35.669998 139.770004</gml:pos>
  </gml:Point>
</georss:where>

I already have come this far, with:

$ns_geo=$item->children($namespace['georss']);
$geo=$ns_geo->children($namespace['gml']);

var_dump($geo) will output

object(SimpleXMLElement)#34 (1) { 
  ["Point"]=> object(SimpleXMLElement)#30 (1) { 
    ["pos"]=> string(18) "52.373801 4.890935" 
  } 
} 

but

echo (string)$geo->position or (string)$geo->position->pos; 

will give me nothing. Is there something obvious that i am doing wrong?

Tomalak
  • 332,285
  • 67
  • 532
  • 628
Richard
  • 4,516
  • 11
  • 60
  • 87

3 Answers3

4

You could work with XPath and registerXPathNamespace():

$xml->registerXPathNamespace("georss", "http://www.georss.org/georss");
$xml->registerXPathNamespace("gml", "http://www.opengis.net/gml");
$pos = $xml->xpath("/georss:where/gml:Point/gml:pos");

From the docs, emphasis mine:

registerXPathNamespace […] Creates a prefix/ns context for the next XPath query.

More ways to handle namespaces in SimpleXML can be found here, for example:
Stuart Herbert On PHP - Using SimpleXML To Parse RSS Feeds

Tomalak
  • 332,285
  • 67
  • 532
  • 628
  • thanks, I came to the same conclusion this worked $geo = $feed->xpath('//gml:pos');echo $geo[0]; maybe the other way can't handle nested namespace elements – Richard Jan 06 '10 at 18:14
  • actually, I misspelled something.$geo->point should be $geo->Point (uppercase) – Richard Jan 06 '10 at 19:28
0
echo $geo->pos[0];
Eduardo
  • 7,631
  • 2
  • 30
  • 31
0

This is how I did it without using xpath:

$georss = $photo->children('http://www.georss.org/georss');
$coords;
if($georss->count()>0) {
    $gml = $georss->children('http://www.opengis.net/gml');
    if($gml->count()>0) {
        if(isset($gml->Point->pos)) {
            $coords = $gml->Point->pos;
        }
    }
}
Daniel
  • 1,422
  • 1
  • 13
  • 21