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 文件的任何信息。

感谢您的时间和帮助。

问候,

佩塔尔

编辑:我发布了一个新线程:GPX 解析模式和“标准”,我在其中询问人们实际上是如何解析 GPX 文件的。如果您有任何想法,请在此处发布您的答案。

4

5 回答 5

4

架构作者选择使用<xs:sequence>而不是<xs:all>. XSD 序列是特定于订单的。

拼写错误的属性名称将是无效输入。你必须优雅地验证和失败。计算机不能很好地处理歧义。

希望有帮助...

更新:

对不起,请允许我详细说明。该问题是由模式的作者和 GPX 输出作者(各种软件包和设备的)创建的。

基本上,如果一个人可以查看一段数据并理解它的含义,那么软件实施者就有责任创建灵活的验证以使程序可用。

例如,假设您有一个输入字段,您应该输入一个美元金额,而用户输入“$.05”,那么软件应该足够聪明地识别出 5 美分,并且足够聪明地识别出有一个前面的空间,它是无用的。

这同样适用于来自设备的文件。是的,问题是他们造成的。是的,当格式有一个非常好的严格定义时,必须将设备的输出视为用户输入是荒谬的。但这就是您目前面临的问题。归根结底,没有人关心您必须克服哪些技术挑战才能使其发挥作用。他们关心的只是“它是否有效”和“这对我有多大用处”。

因此,如果您看到这些字段是乱序的,但否则所有必需的数据都存在,请重新排列这些字段,以便它们通过验证。使您的导入灵活。如果缺少空白,则使用警告消息填充数据空白。但是,让它工作。

除了在针对 XSD 验证数据之前尝试对数据进行处理之外,如果您发现验证错误总是由字段的顺序引起(这是 XSD 中 xs:sequence 和xs:all),就是改变你的 XSD。将其从序列切换到全部。你可以先试试官方的XSD。如果它通过了,那么您就不必验证更宽松的版本。

我希望这会有所帮助...

于 2011-11-29T16:09:24.200 回答
0

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

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

在链接的文章中,我从 GPX 上传了一个准系统 php dom 解析,它运行良好(与 GPSTM 生成的 GPX 100% 兼容)GPX 解析模式和“标准”

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

于 2012-01-26T20:30:35.713 回答
0

因此,事实证明有一些 GPS 设备/GPS 记录系统/等。生成 .gpx 文件而不符合官方 GPX 架构。这个结论让我问一个问题:为什么?我真的不明白它背后的想法。此外,对于我发现的大多数无效文件,问题不是可能被视为附加功能的问题,而是类似于不遵循某些属性的子项的正确顺序,我认为这是完全愚蠢的。

我唯一能想到的是您在验证之前对 GPX 输入进行预处理(此时唯一的要求是 GPX 数据格式正确)。

我会使用以身份转换开头的 XSLT 来传递所有内容,而无需更改。然后,您可以通过剥离具有特定名称空间的所有内容来覆盖身份转换。您还可以强制执行子元素的顺序(属性没有子元素,所以我认为这是一个错字)并更正拼写错误的元素/属性名称。

于 2011-11-29T21:22:36.583 回答
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 文件的原因。此外,这也是大多数解析应用程序忽略这些严格规则的原因。

于 2012-03-08T20:42:03.450 回答
0

原因示例:geocaching.com 生成 .gpx 文件,其中包含他们定义的特殊模式扩展名。

GSAK 还为 gpx 文件添加了“价值”。恐怕 gpx 世界并没有像你想象的那样标准化。

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

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

于 2011-11-29T15:25:51.197 回答