GPX模式验证问题

3
我正在开发一个应用程序,主要使用GPX文件作为输入数据。考虑到GPX文件应该由GPX模式定义(如在此处定义:http://www.topografix.com/gpx.asp),我的应用程序的第一件合理事情是根据模式验证输入文件(当然要考虑不同的版本)。到目前为止一切都很好。对于我测试的初始文件,一切都很完美。然而,有时我使用的.gpx文件被证明与相关的gpx模式无效。因此,我试图使用其他类似工具导入它们,但奇怪的是,没有返回错误并且文件被解析得很好。因此,最合乎逻辑的结论是我的代码存在问题。然而,在彻底调查后,我的代码完全正常,目前没有任何问题。这甚至通过topografix.com提供的建议验证技术得到了验证(http://www.topografix.com/gpx_validation.asp),并且再次得出结论:该文件无效。
因此,事实证明有一些GPS设备/GPS记录系统等会生成不符合官方GPX架构的.gpx文件。这个结论让我想问一个问题:为什么?我真的不理解背后的想法。此外,对于我发现的大多数无效文件,问题并不是可以视为附加功能的东西,而是像某些元素子级别的顺序不正确之类的问题,我认为这完全是愚蠢的。
这让我向您提出两个问题。首先,如果有人能够解释一下为什么我在网上找到的许多GPX文件不符合官方GPX架构,我会很高兴。其次,如果您要解析GPX文件,您如何处理这个问题?毕竟,轨迹点将在文件中,所以我是否只需忽略XML模式验证并进行直接解析?但是,如果有拼写错误的属性名称,我的系统将崩溃。任何关于如何处理解析GPS文件的信息都将非常感激。
感谢您的时间和帮助。
问候,
Petar

编辑:我已经发布了一个新的主题: GPX解析模式和“标准”,在那里我正在询问人们实际上如何解析GPX文件。如果您有想法,请在那里发布您的答案。


请问你能把你的无效文件发布到gist或其他的pastebin上吗? - Homer6
没有什么特殊的地方。问题是track point的子元素ele和time的顺序错误,这在GPX模式中是不允许的。 - Petar
5个回答

4
模式作者选择使用 <xs:sequence> 而不是 <xs:all>。XSD 序列是有序的。
拼写错误的属性名称将是无效输入。您必须进行验证并优雅地失败。计算机处理模棱两可的情况效果不佳。
希望能对你有所帮助...
更新:
抱歉,让我详细解释一下。问题是由模式的作者和 GPX 输出的作者(各种软件包和设备的作者)共同创造的。
基本上,如果一个人可以查看一段数据并理解它的含义,那么软件实现者就应该创建灵活的验证,以便程序可用。
例如,假设您有一个输入字段,应该输入美元金额,而用户输入了“$.05”,那么软件应该足够聪明,以将其识别为 5 美分,并且识别到前面有空格,这是无用的。
同样适用于来自设备的文件。是的,问题是由他们创建的。是的,当有格式的严格定义时,将设备输出视为用户输入是荒谬的。但这是您当前面临的问题。最后,没有人关心您必须克服哪些技术难题才能使其正常工作。他们唯一关心的是“它是否有效”和“对我有多有用”。
因此,如果您发现字段排序不正确,但除此之外,所有必需的数据都存在,则重排这些字段以通过验证。使您的导入灵活。如果缺少间隙,则使用警告消息填充数据中的空白。但是,让其正常工作。
除了在验证它与 XSD 相匹配之前尝试修改数据之外,如果您发现验证错误仅由字段顺序(这是在 xs:sequence 和 xs:all 之间常见的误解)引起,请改变您的 XSD。将其从 sequence 切换到 all。您可以首先尝试官方 XSD。如果通过,则不必验证更松散的版本。
希望能对你有所帮助...

谢谢,但这绝不是我的问题的答案。问题是为什么人们会产生这种模棱两可的情况,考虑到他们完全没有必要这样做。 - Petar
你的回答现在更有意义了,我非常感激。我很高兴你同意我的看法,部分地遵守严格的定义是没有意义的。你提出的两个解决问题的建议都很好。我担心的是,由于市面上有太多的GPX生产设备,如果要使系统通用,就不可能支持它们所产生的所有不同版本的GPX。因此,如果你特别处理过GPX解析,请告诉我你是如何做到的。 - Petar

0

正如Homer6所指出的那样,XML文件中标签的顺序是一个问题。

在我继续之前,请注意GPX 1.0和GPX 1.1非常不同。大多数应用程序生成/消耗GPX 1.0。例如,在1.0中,有一个用于电子邮件的正则表达式:

[\p{L}_]+(\.[\p{L}_]+)*@[\p{L}_]+(\.[\p{L}_]+)

如果任何应用程序有一个文本字段要求用户输入他的电子邮件(稍后将存储在GPX文件中),它应该非常严格。如果用户输入“name AT gmail.com”,则生成的GPX文件无效。

XML文件的模式非常严格。大多数应用程序开发人员不希望在用户输入将存储在GPX文件中的数据时进行相同的严格验证。这就是为什么大多数文件不是正确的GPX文件的原因。此外,这也是大多数解析应用程序忽略这些严格规则的原因。


0

为什么需要示例?geocaching.com生成带有他们定义的特殊模式扩展名的.gpx文件。

GSAK还向gpx文件添加“值”。很遗憾,gpx世界并没有像您想象的那样标准化。

所有这些东西都不是您使用的模式的一部分。换句话说,您对严格模式检查的想法存在问题。

是他们而不是你。但是你被迫适应“他们”。


请纠正我,但是使用特殊模式扩展生成.gpx文件并不会使其不符合标准的.GPX模式。它仅需要同时符合扩展模式的要求。然而,正如你所说我的严格模式检查存在问题(我也是这样认为的),你能否给出你的建议,关于如何解析GPS文件? - Petar

0
所以,事实证明有一些GPS设备/GPS记录系统等会生成.gpx文件,但不符合官方GPX模式。这个结论让我想问一个问题:为什么?我真的不理解背后的想法。此外,我发现大部分无效的文件都存在“问题”,不是额外的功能,而是类似于某些属性的子元素未按照正确顺序排列等问题,我认为这完全是愚蠢的。
我能想到的唯一方法就是,在验证之前对GPX输入进行预处理(此时唯一的要求是GPX数据格式良好)。我会使用XSLT,从身份转换开始,将一切都保持不变。然后,您可以通过剥离特定命名空间的所有内容来覆盖身份转换。您还可以强制执行子元素的顺序(属性没有子元素,因此我认为那是笔误),并更正拼写错误的元素/属性名称。

谢谢您的建议。是的,一种选择是在验证之前对GPX进行预处理。问题是我想让我的程序通用 - 能够处理输入的任何GPX文件。然而,我对XSLT和您建议的方法一无所知。如果它能解决处理许多不同版本的GPX文件并为所有文件单独创建函数的问题,我会进行调查。附注:已更正属性拼写错误 :) - Petar
@pe60t0 - 如果你真的想要通用性,可以放弃模式验证,只需将GPX数据视为格式良好的XML即可。 - Daniel Haley
@pe60t0 - 另外,您可能最终需要为GPX输入中的特定变化编写代码。有些变化不需要任何特殊代码(例如元素顺序不同)。 - Daniel Haley
你确定完全放弃模式验证是正确的做法吗?我认为这种方法会让系统很容易崩溃,并且可能会出现许多错误。 - Petar

0

正如您所指出的那样,模式存在的问题在于,并非所有实现都是标准化的,有些甚至是专有的。在这种情况下,最好的方法是将文件导入程序并将其另存为GPX格式(即使原始格式已经是GPX)。

我使用一个名为GPS TRACKMAKER的免费程序,它可以打开和保存各种格式,包括GPX。它还可以直接从各种手持GPS设备(Garmin、Magellan等)下载数据。下载GPSTM http://www.gpstm.com/dwlpage.php

在链接的文章中,我上传了一个简单的PHP DOM解析器,可以很好地工作(与GPSTM生成的GPX完全兼容)GPX解析模式和“标准”

感谢Odilon Ferreira Junior(GPSTM作者)提供如此优秀的免费工具。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接