2010-01-06 7 views
1

J'essaie d'obtenir les informations géographiques de l'API google-picasa. Ceci est le XML original:SimpleXML: Travailler avec XML contenant des espaces de noms

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

Je suis déjà venu jusqu'ici, avec:

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

var_dump($geo) volonté sortie

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

mais

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

me donnera rien. Y at-il quelque chose d'évident que je fais mal?

Répondre

4

Vous pouvez travailler avec XPath et 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"); 

De la documentation, Souligné par l'auteur:

registerXPathNamespace [...] Crée un contexte préfixe/ns pour la prochaine XPath requête.

d'autres façons de gérer les espaces de noms SimpleXML se trouvent ici, par exemple:
Stuart Herbert On PHP - Using SimpleXML To Parse RSS Feeds

+0

merci, je suis arrivé à la même conclusion cela a travaillé $ geo = $ feed-> xpath ('// gml: pos'); echo $ geo [0]; peut-être l'autre façon ne peut pas gérer les éléments d'espace de noms imbriqués – Richard

+0

En fait, j'ai mal orthographié quelque chose. $ Geo-> point devrait être $ geo-> Point (majuscule) – Richard

0
echo $geo->pos[0]; 
+0

je l'ai déjà try'd que aussi (sans (chaîne))? – Richard

+1

Cette méthode ne sera pas accéder aux espaces de noms –

0

Voilà comment je l'ai fait sans utiliser 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; 
     } 
    } 
} 
Questions connexes