GPX 解析模式和“标准”

Posted

技术标签:

【中文标题】GPX 解析模式和“标准”【英文标题】:GPX parsing patterns and "standards" 【发布时间】:2012-01-09 07:29:03 【问题描述】:

我想从这个帖子继续讨论:GPX Schema validation problems。直截了当,我想问一下人们是如何在他们的软件中解析和使用 GPX 文件的,或者给我一些关于应该如何做的建议。

虽然有人可能会说,只要解析 trkpt 元素并在您的软件中使用它们,对我来说事情并不是那么简单。首先,正如上面引用的帖子中所讨论的,许多 gpx 生产设备(软件、gps-handheld-devices 等)产生不符合官方 GPX 架构的 gpx 文件(元素布局在顺序错误、值类型改变、元素名称改变等)。在开始解析 gpx 文件时,我最初的教导是首先检查它们是否针对 GPX 模式进行验证。其中有很多包含实际的 GPS 数据(纬度/经度/高程值的序列),但它的呈现格式(尽管 GPX 后缀很好地隐藏了)可以无论如何设计。因此该文件将包含所需的数据,但不符合 GPX 模式。如何克服这个问题?有什么方法可以让软件接受通用 GPX 文件作为输入?

其次,我想指出我对您可能提出的各种建议不感兴趣(例如,首先预处理 GPX 文件,然后解析它,更改您的架构等)关于如何解决问题。如果有人知道在实践中是如何完成的,我会更感兴趣。因此,如果有人在(可能)商业环境中处理 GPX 文件方面有或曾经有过任何经验,请分享您的想法。

我希望我的观点清楚。

谢谢,

佩塔

【问题讨论】:

GPX Schema validation problems的可能重复 我不认为它是重复的。在验证问题线程中,我正在讨论为什么 gpx 文件不符合 gpx 架构。在这里,我正在讨论如何与他们合作。谢谢 【参考方案1】:

在我的应用程序中,我使用的是普通的 XML 解析器(例如 pythons xml.dom.minidom),我只是使用标签名称来访问我需要的信息。 正如other Thread 中提到的,导致验证失败的是GPX 标准定义中的<xsd:sequence>。虽然 GPX 生产设备确实应该遵守标准,但在解析方面实际上并没有什么大不了的(至少对于我处理的 GPX 文件/设备而言)。

如果 GPX 文件包含其他信息,那么它将被删除(除非您选择提取您不知道的标记名)。

如果此方法因文件不是有效的 XML 或 GPX 使用不同的标签名称而失败,例如经纬度信息 除了为这个特定的用例编写一个特殊的导入器之外,没有其他方法可以读取文件(我没有看到这样的文件,除了损坏的文件,在野外)

【讨论】:

【参考方案2】:

我刚刚开发了一个简单的 gpx 解析器,我用它从 gpx 文件中抓取轨迹和航点并保存在数据库中。我已经剥离了所有数据库代码并留下了一个准系统示例。

<?php
include('simple_html_dom.php');

if (file_exists('5alqs3.gpx')) 
    $xml = simplexml_load_file('5alqs3.gpx');
    foreach( $xml->children() AS $child ) 
        $name = $child->getName();
        if ($name == 'wpt') 
            print_r($name.'    ');
            echo $child['lat'].' '.$child['lon'].'  ';
            $name = $child->children()->getName();
            if ($name = 'ele') 
                echo $child->children().'<br/>';
            
        
        if ($name == 'trk') 
            foreach( $child->children() AS $grandchild ) 
                $grandname = $grandchild->getName();
                if ($grandname == 'name') 
                    echo $grandchild.'<br/>';
                
                if ($grandname == 'trkseg') 
                    foreach( $grandchild->children() AS $greatgrandchild ) 
                        $greatgrandname = $greatgrandchild->getName();
                        print_r($greatgrandname.'  ');
                        //echo '<br/>';
                        if ($greatgrandname == 'trkpt') 
                            echo $greatgrandchild['lat'].' '.$greatgrandchild['lon'];
                            foreach( $greatgrandchild->children() AS $elegreatgrandchild ) 
                                echo $elegreatgrandchild.'<br/>';
                            
                        
                        if ($greatgrandname == 'ele') 
                            print_r($greatgrandchild);
                           
                    
                
            
         
    
 else 
    exit('Failed to open 5alqs2.gpx.');
                
?>

您可以更进一步并从中解析 kml。查看此链接以获取有关此主题的更多信息。 Creating a kml file from a mysql database with php

此代码适用于多个轨道。

【讨论】:

谢谢,这很有用。

以上是关于GPX 解析模式和“标准”的主要内容,如果未能解决你的问题,请参考以下文章

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

浏览器 标准模式和怪异模式

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

浏览器标准模式和怪异模式之间的区别

浏览器的标准模式和怪异模式的区别

浏览器标准模式与怪异模式的区别