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

Posted

技术标签:

【中文标题】用 PHP 解析 GPX 文件,获取 <extensions> 元素值【英文标题】:GPX file parse with PHP, get <extensions> element values 【发布时间】:2014-08-21 10:16:18 【问题描述】:

我有 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->扩展名是:

SimpleXMLElement Object
(
)

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

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

示例 gpx 位于 www.vovcinec.net/gpx/e.gpx (~700kB)

【问题讨论】:

您的 XML 使用命名空间,请参阅 ***.com/a/24101080/2265374 示例。 SimpleXMLElement 对象([@attributes] => 数组([lat] => 50.04527 [lon] => 14.433993333333333)[ele] => 280.5 [time] => 2014-06-30T20:57 :21.71 [extensions] => SimpleXMLElement Object ( ) ) 如何获取 lat 和 lng ??????请帮帮我 【参考方案1】:

你不能直接获取它们,因为它们在命名空间中,你需要先使用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>';

【讨论】:

不要使用别名/前缀从文档中读取命名空间,它是标识符。别名/前缀是可选的,不是唯一的,并且可以更改(即使在单个文档中)。【参考方案2】:

希望你能帮助跟踪代码

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

无需使用getNamespaces()方法

【讨论】:

以上是关于用 PHP 解析 GPX 文件,获取 <extensions> 元素值的主要内容,如果未能解决你的问题,请参考以下文章

如何从 GPX 文件中提取高程数据

GPX 解析模式和“标准”

在我的 php 文件解析和下载数据时调用 preloader(gif , loading image)

从 GPX 文件创建 XSD 文件

iOS测试技巧:GPX文件修改经纬度

解析带有重复标签的 XML 文件