【问题标题】:GPX Schema validation problemsGPX Schema 验证问题
【发布时间】:2012-01-08 22:21:09
【问题描述】:

我正在构建一个主要使用 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 parsing patterns and "standards",我在此询问人们在实践中是如何解析 GPX 文件的。如果您有任何想法,请在此处发布您的答案。

【问题讨论】:

  • 能否将您的无效文件发布到 gist 或其他 pastebin 中?
  • 它没有什么特别之处。问题是轨迹点的子元素 ele 和时间顺序错误,GPX 架构不允许这样做

标签: xml parsing validation xsd gpx


【解决方案1】:

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

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

希望对您有所帮助...

更新:

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

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

例如,假设您有一个输入字段,您应该输入一个美元金额,而用户输入“$.05”,那么软件应该足够智能以识别为 5 美分,并且足够智能以识别前面有空,没用。

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

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

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

希望对你有帮助……

【讨论】:

  • 谢谢,但这不是我问题的答案。问题是为什么人们会产生这种模棱两可的想法,他们不这样做绝对没有问题。
  • 您的回答现在更有意义了,我对此深表感谢。我很高兴您同意我的观点,即仅部分符合严格的定义是没有意义的。您解决问题的两个建议都很好。我担心的事情是,有这么多生产 gpx 的设备,如果你想让你的系统通用,就不可能支持它们生产的所有不同版本的 gpx。因此,如果您特别处理过 GPX 解析,请告诉我您是如何做到的。
【解决方案2】:

原因示例?:geocaching.com 生成 .gpx 文件,并带有他们定义的特殊架构扩展名。

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

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

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

【讨论】:

  • 如果我错了,请纠正我,但是生成具有特殊模式扩展名的 .gpx 文件并不会阻止它符合标准的 .GPX 模式。它也必须对扩展模式有效。然而,正如您所说,我的严格模式检查存在问题(我假设),您能否就如何解析 GPS 文件给我您的建议?
【解决方案3】:

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

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

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

【讨论】:

  • 感谢您的建议。是的,一种选择是在验证之前对 GPX 进行预处理。问题是我想让我的程序通用 - 使用输入的任何 GPX 文件。但是,我对 XSLT 和您建议的方法一无所知。如果它能够解决必须为所有这些文件处理具有单独功能的许多不同版本的 GPX 文件的预处理问题,我会调查它。 PS:属性错字已修复:)
  • @pe60t0 - 如果您真的想要通用,请放弃模式验证,只需将 GPX 数据视为格式正确的 XML。
  • @pe60t0 - 此外,您可能最终不得不针对 GPX 输入中的特定变化进行编码。有些变体不需要任何特殊代码(例如,元素顺序不同)。
  • 你确定正确的做法是完全放弃模式验证吗?我认为使用这种方法很容易导致系统崩溃并且可能会出现许多错误。
【解决方案4】:

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

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

在链接的文章中,我上传了一个从 GPX 解析的准系统 php dom,它运行良好(与 GPSTM 生成的 GPX 100% 兼容)GPX parsing patterns and "standards"

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

【讨论】:

    【解决方案5】:

    正如 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 文件的原因。此外,这也是大多数解析应用程序忽略这些严格规则的原因。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-09-10
      • 2011-06-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多