我遇到了一个问题,即尝试使用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。我还需要从地标中获取描述。
我在尝试获取StartTime时从上面的代码中更改了1行,但它不起作用。
$element= $xml->xpath('//default:ExtendedData/Data[name="StartTime"]/value');
如果有人可以帮助我,或者指出我正确的方向,我会非常精彩,因为我还没有真正使用过XML。
谢谢。
答案 0 :(得分: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"));
两者都应该返回您希望的项目。