使用PHP解析GPX文件,获取<extensions>元素值</extensions>

时间:2014-06-30 23:22:01

标签: php xml gpx

我有xml / gpx文件:

<?xml version="1.0" encoding="utf-8"?>
<gpx xsi:schemaLocation="http://www.topografix.com/GPX/1/1">
  <metadata>
....
  </metadata>
  <trk>
    <trkseg>
      <trkpt lat="50.04551333333333" lon="14.434101666666667">
        <ele>282</ele>
        <time>2014-06-30T20:56:03.92</time>
        <extensions>
          <gpxtpx:TrackPointExtension>
            <gpxtpx:hr>100</gpxtpx:hr>
          </gpxtpx:TrackPointExtension>
        </extensions>
      </trkpt>
...
</gpx>

加载:

$xml=simplexml_load_file($gpx_file);

解析女巫

foreach($xml->trk->trkseg->trkpt as $point){}

很好。但是我无法获得/ extension // extension /

的内容

print_r($ point)是

SimpleXMLElement Object
(
    [@attributes] => Array
        (
            [lat] => 50.04527
            [lon] => 14.433993333333333
        )

    [ele] => 280.5
    [time] => 2014-06-30T20:57:21.71
    [extensions] => SimpleXMLElement Object
        (
        )
)

我无法获得SimpleXMLElement对象。

Print_r($ point-&gt;扩展名为:

SimpleXMLElement Object
(
)

我尝试Converting a SimpleXML Object to an Array和其他类似的方式,但我失败了 - 输出是空数组。

进入字符串/数组的任何想法/方式?

样本gpx位于www.vovcinec.net/gpx/e.gpx(~700kB)

2 个答案:

答案 0 :(得分:3)

您无法直接获取它们,因为它们位于命名空间中,您需要先使用getNamespaces()方法。考虑这个例子:

$xml = simplexml_load_file('e.gpx');
foreach($xml->trk->trkseg->trkpt as $trkpt) {

    $namespaces = $trkpt->getNamespaces(true);
    $gpxtpx = $trkpt->extensions->children($namespaces['gpxtpx']);
    $hr = (string) $gpxtpx->TrackPointExtension->hr;
    echo '<pre>';
    print_r($hr);
    echo '</pre>';
}

答案 1 :(得分:0)

我希望你能帮助我们关注代码

foreach($gpx->trk->trkseg->children() as $trkpts) {
    echo (string)$trkpts->extensions->children('gpxtpx',true)->TrackPointExtension->hr;
}

无需使用getNamespaces()方法