【问题标题】:Parse Garmin GPX XML data using SimpleXML使用 SimpleXML 解析 Garmin GPX XML 数据
【发布时间】:2017-08-09 20:53:05
【问题描述】:

我有这个 GPX 文件:

<?xml version="1.0" encoding="UTF-8" standalone="no" ?>
<gpx xmlns="http://www.topografix.com/GPX/1/1" .. >
    <metadata>
        <link href="http://www.garmin.com">
            <text>Garmin International</text>
        </link>
        <time>2017-03-13T14:42:05Z</time>
    </metadata>
    <trk>
        <name>2017-03-13 15:41:57</name>
        <extensions>
            <gpxx:TrackExtension>
                <gpxx:DisplayColor>Cyan</gpxx:DisplayColor>
            </gpxx:TrackExtension>
            <gpxtrkx:TrackStatsExtension>
                <gpxtrkx:Distance>6482</gpxtrkx:Distance>
                <gpxtrkx:MovingTime>4474</gpxtrkx:TimerTime>
            </gpxtrkx:TrackStatsExtension>
        </extensions>
        <trkseg>
            <trkpt lat="47.1075830329" lon="15.4409365822">
                <ele>466.49</ele>
                <time>2017-03-13T13:26:10Z</time>
            </trkpt>
            <trkpt lat="47.1075813565" lon="15.4409420304">
                <ele>466.49</ele>
                <time>2017-03-13T13:26:11Z</time>
            </trkpt>
            ...
        </trkseg>
    </trk>
</gpx>

我想用 SimpleXML 解析它,但无法访问 TrackStatsExtension。 如何循环通过 TrackStatsExtension - 以获取距离和移动时间?

我想计算平均速度。

【问题讨论】:

    标签: php xml simplexml gpx


    【解决方案1】:

    好的,我自己发现的:

    $xml = simplexml_load_file($file);
    $namespaces = $xml->trk->getNamespaces(true);
    $ext = $xml->trk->extensions->children($namespaces['gpxtrkx']);
    $Distance = $ext->TrackStatsExtension->Distance ;
    $MovingTime = $ext->TrackStatsExtension->MovingTime ;
    $Speed = $Distance / $MovingTime * 3.6 ;
    
    DEFINE ( 'NL', '<br />' ) ;
    echo '--------------------' . NL ;
    echo 'Distance    : ' . $Distance . ' m' . NL ;
    echo 'MovingTime  : ' . $MovingTime . ' s' . NL ;
    echo 'Avg speed   : ' . round ( $Speed, 2 ) . ' km/h'. NL ;
    echo '--------------------' . NL ;
    

    【讨论】:

    • 以这种方式选择命名空间需要知道的两件事:第一,您可以直接使用命名空间别名,而不是通过写-&gt;children('gpxtrkx', true)来调用-&gt;getNamespaces;其次,您实际上应该硬编码来自 xmlns:gpxtrkx 属性的完整标识符,以防生成文件的代码更改为对同一命名空间使用不同的别名。例如define('XMLNS_GPX_TRKX', 'http://....'); $ext = $xml-&gt;trk-&gt;extensions-&gt;children(XMLNS_GPX_TRKX);
    【解决方案2】:

    你有一个简单的错误:

    <gpxtrkx:MovingTime>4474</gpxtrkx:TimerTime>
    

    <gpxtrkx:MovingTime>4474</gpxtrkx:MovingTime>
    

    你也可以使用:

    <gpxtrkx:MovingTime>4474</gpxtrkx:MovingTime>
    <gpxtrkx:TimerTime>4474</gpxtrkx:TimerTime>
    <gpxtrkx:TotalElapsedTime>4474</gpxtrkx:TotalElapsedTime>
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多