2011-04-13 44 views
1

我试图从我生成的KML文件中使用PHP解析出数据位,然后将其发送到我的网络服务器。我想获取元素,并将它们存储到数据库中。存储它们不是问题,它只是获取一些元素。从KML文件中解析某些元素的问题

这里是连接例如KML文件即时试图解析的:

<?xml version="1.0" encoding="UTF-8"?> 
<kml xmlns="http://www.opengis.net/kml/2.2"> 
    <Document> 
     <name>RandomName</name> 
     <description>-</description> 
     <Style id="line"> 
      <LineStyle> 
      <color>CD0000FF</color> 
      <width>4</width> 
      </LineStyle> 
     </Style> 
     <ExtendedData> 
      <Data name="StartTime"> 
       <value>1302653118875</value> 
      </Data> 
      <Data name="EndTime"> 
       <value>1302653159274</value> 
      </Data> 
      <Data name="Type"> 
       <value>cycle</value> 
      </Data> 
     </ExtendedData> 

    <Placemark> 
     <name>PlaceName2</name> 
     <description><p>Current Altitude: <b>0.0 ft</b><br/>Current Speed: <b>0.0 m/s</b><br/>Total Distance: <b>0.608 km</b></p></description> 
     <styleUrl>#line</styleUrl> 
     <LineString> 
      <extrude>1</extrude> 
      <tessellate>1</tessellate> 
      <coordinates> 
      -122.083393,37.427768,0.0 
      -122.084395,37.427768,0.0 
      </coordinates> 
     </LineString> 
    </Placemark> 
</Document> 
</kml> 

我用下面的代码,我能够走出最初的名称和说明。

function getTrackDescription($file){ 
    $xml = simplexml_load_file($file); 
    $namespace = $xml->getDocNamespaces(); 

    if(isset($namespace[""])){ 
     $xml->registerXPathNamespace("default",$namespace[""]); 
    } 

    $element= $xml->xpath('//default:description'); 
    return $element[0]; 
} 

我能够得到这些元素,但当我试图获得其他任何东西时,我什么也得不到。我需要能够访问ExtendedData中的值 - StartTime,EndTime和Type。我还需要从Placemark获得描述。

我改变了上面代码中的1行,试图获取StartTime,但它不起作用。

$element= $xml->xpath('//default:ExtendedData/Data[name="StartTime"]/value'); 

如果任何人都可以帮助我,或者指出我朝着正确的方向,我会非常感谢,因为我没有真正使用过XML。

谢谢。

+0

尝试'/ kml/Document/ExtendedData/Data/value' ... – 2011-04-13 15:10:02

+0

就我所见,该文件中没有名称空间。那么你为什么要加载和配置名称空间?为什么不把它作为一个普通的非名称空间文档呢? – ircmaxell 2011-04-13 15:14:47

+0

我想你应该注册命名空间URI'http:// www.opengis.net/kml/2.2'。依靠surce前缀并不是一个好习惯。 – 2011-04-13 15:33:45

回答

0

由于您已经为名称空间“http://www.opengis.net/kml/2.2”定义了前缀,因此您必须确保您将它用于所有落入该名称空间的元素。在上面的代码中,您基本上正在寻找ExtendedData,前缀为default,但随后在名称空间中的其他地方查找没有前缀的Data

这里是你的选择:

$xml = simplexml_load_file($file); 
var_dump($xml->xpath("//ExtendedData/Data[@name='StartTime']/value")); 

$xml = simplexml_load_file($file); 
$xml->registerXPathNamespace("default","http://www.opengis.net/kml/2.2"); 
var_dump($xml->xpath("//default:ExtendedData/default:Data[@name='StartTime']/default:value")); 

双方应返回你希望的项目。

+0

+1好抓! – 2011-04-14 22:22:55