2009-09-23 10 views
1

J'écris un script qui lit et manipule un document KML (xml). Ci-dessous un extrait du document que je lis:Simplexml XPath étrangeté

<?xml version="1.0" encoding="UTF-8"?> 
<!-- Generated by Feature Manipulation Engine 2009 (Build 5658) --> 
<kml xmlns="http://earth.google.com/kml/2.2" xmlns:atom="http://www.w3.org/2005/Atom"> 
    <Document> 
     <name>South Australia</name> 
     <visibility>1</visibility> 
     <description><![CDATA[Statistical Local Area 2008]]></description> 
     <Folder id="kml_ft_SA_SLA08"> 
      <name>SA_SLA08</name> 
      <Placemark id="kml_1"> 
       <name>Mitcham (C) - West</name> 
       <Style> 
        <!-- style info blah blah --> 
       </Style> 
       <Polygon> 
        <!-- blah blah --> 
       </Polygon> 
      </Placemark> 

      <!-- snip lots more Placemarks --> 
     </Folder> 
    </Document> 
</kml> 

Le problème que je vais avoir est avec l'aide de XPath pour sélectionner quelque chose de lui!

$doc = new DOMDocument(); 
$doc->load('myfile.xml'); // returns true 
$xp = new DOMXPath($doc); 

$places = $xp->query("//Placemark"); 
echo $places->length;   // --> 0 ??!!?? 
$everything = $xp->query("//*"); // (so I know that the XPath isn't fully borked) 
echo $everything->length; // --> 2085 

Que se passe-t-il ici?

+0

Peut-être qu'il pourrait avoir quelque chose à voir avec l'espace de noms peut-être? –

+0

Oui! La suppression de l'attribut 'xmlns' l'a fait fonctionner ... aucune idée de pourquoi, bien que ... – nickf

Répondre

5
<?php 
$doc = new DOMDocument(); 
$doc->load('file.xml'); // returns true 
$xp = new DOMXPath($doc); 
$xp->registerNamespace('ge', 'http://earth.google.com/kml/2.2'); 

$places = $xp->query("//ge:Placemark"); 
echo $places->length;   // --> 0 ??!!?? 
$everything = $xp->query("//*"); // (so I know that the XPath isn't fully borked) 

//echo $doc->saveXML(); 

Apparemment, vous devez vous enregistrer l'espace de noms « ge » et interroger en tant que tel, du moins est-ce que je suis venu avec au bout de quelques minutes googler. Je suppose que parfois nous oublions que nous avons affaire à des espaces de noms: p

+0

donc chaque fois que je me réfère à un nœud, alors je dois utiliser' ge: nodeName'? C'est ennuyeux ... – nickf

+0

Il pourrait y avoir un moyen de contourner cela, mais je ne suis pas un gourou xml. –

+0

Non, il n'y a aucun moyen de le contourner. Si vous souhaitez utiliser un XPath pour faire correspondre des éléments ou des attributs XML dans un espace de noms, vous devez toujours associer un préfixe à cet espace de noms et utiliser explicitement le préfixe dans XPath. – MiMo