GPX模式验证问题
我正在构建一个主要以GPX文件作为输入数据的应用程序。鉴于gpx文件应该由gpx模式定义(这里定义为:http://www.topografix.com/gpx.asp),我教导的第一件事情与我的应用程序合理的做法是根据模式验证输入文件(记住当然不同的版本)。到现在为止还挺好。对于我测试的初始文件,一切都很完美。但是,有时我会使用对相关gpx模式无效的.gpx文件。所以,我试图用其他类似的工具导入它们,奇怪的是,没有错误被返回,并且文件被完全解析。所以,最合理的结论是我的代码存在问题。然而,经过彻底调查,我的代码完全正常,目前没有任何问题。这甚至通过来自topografix.com的建议验证技术(http://www.topografix.com/gpx_validation.asp)验证,并且它再次得出结论该文件是无效的。GPX模式验证问题
因此,事实证明,有一些GPS设备/ GPS录音系统/等。这会产生.gpx文件而不符合官方的GPX模式。这个结论让我问这个问题:为什么?我严重不理解背后的想法。此外,我发现大多数无效文件都是这个问题,这个问题并不是一个可以被视为额外功能的东西,而是像某些元素的孩子不遵循正确的顺序,我认为这是完全愚蠢的。
这使我向你提出两个问题。首先,如果有人能向我解释为什么我在网上发现的很多GPX文件不符合官方的GPX模式,我会很高兴。其次,我想问问你如何解决这个问题,如果你要解析GPX文件。毕竟,无论如何,跟踪点将在文件中,所以我只需要忽略XML模式验证并继续直接解析?但是,如果有拼写错误的属性名称,我的系统会崩溃。任何关于如何处理解析GPS文件的信息都将非常感谢。
感谢您的时间和帮助。
问候,
斯托
编辑:我已经发布了一个新的线程:GPX parsing patterns and "standards",我要问人们是如何实际解析在实践中GPX文件。如果你有一个想法,请在那里发表你的答案。
为什么?:geocaching.com生成具有特定架构扩展名的.gpx文件,它们已经定义。
GSAK还增加了“价值”gpx文件。恐怕,gpx世界并不是标准化的。
这些东西都不是您正在使用的模式的一部分。换句话说,您对严格模式检查的想法存在问题。
这是他们,不是你。但你被迫容纳“他们”。
如果我错了,请纠正我,但生成具有特殊架构扩展名的.gpx文件不会阻止它符合标准.GPX模式。它也必须对扩展模式有效。不过,正如你所说,我严格的模式检查有问题(我认为),你能告诉我你如何解析GPS文件吗? – Petar
模式作者选择使用<xs:sequence>
而不是<xs:all>
。 XSD序列是特定于订单的。
拼写错误的属性名称将是无效输入。你必须优雅地验证和失败。计算机模糊不清。
希望可以帮助...
更新:
对不起,请允许我详细说明。该问题由架构的作者和GPX输出作者(各种软件包和设备)创建。
基本上,如果一个人可以看一块数据并理解它的含义,那么软件实施者就有责任创建灵活的验证,以便该程序可用。
例如,假设您有一个输入字段,您应该输入美元金额,并且用户输入“$ .05”,则该软件应该足够聪明,可以识别出5美分和足够智能认识到前面有一个空间,而且没用。
这同样适用于来自设备的文件。是的,这个问题是由他们创造的。是的,当对格式有完美的严格定义时,必须将设备的输出作为用户输入来处理是很荒谬的。但这是你目前面临的问题。而在这一天结束时,没有人关心你必须克服哪些技术挑战才能使其发挥作用。他们关心的只是“它是否有效”和“这对我有多大用处”。
因此,如果您看到这些字段出现故障,但除此之外所有所需的数据都存在,请重新排列这些字段以使它们通过验证。让您的导入更为灵活。如果缺少缺口,填写数据中的空白并附带警告消息。但是,让它工作。
除了在根据XSD对数据进行验证之前尝试按摩数据之外,您还可以执行其他操作,如果您发现验证错误始终仅由字段顺序引起(这是XSD中常见的误解xs:sequence和xs:all),就是改变你的XSD。从序列切换到全部。你可以先试试官方的XSD。如果它通过了,那么你将不必验证更宽松的版本。
我希望帮助...
所以,事实证明,有一些GPS设备/ GPS记录 系统的/ etc。这些文件生成的.gpx文件不符合 官方GPX模式。这个结论让我问这个问题: 为什么?我严重不理解背后的想法。此外, 大多数我已经找到了无效的文件,问题不是 的东西,可以被视为一个额外的功能,但 像不继与某些属性 孩子,我认为是正确的顺序完全愚蠢。
我能想到的唯一事情就是在验证之前预处理GPX输入(此时唯一的要求是GPX数据格式良好)。
我会使用以身份转换开始的XSLT来通过一切通过不变。然后,您可以通过剥离具有特定名称空间的所有内容来覆盖身份转换。你也可以强制执行子元素的顺序(属性没有子元素,所以我认为这是一个错字)并且纠正拼写错误的元素/属性名称。
感谢您的建议。是的,一种选择是在验证之前预处理GPX。问题是我想让我的程序通用 - 使用任何GPX文件输入。但是,我不知道XSLT和您建议的方法。如果它能够解决不得不处理许多不同版本的GPX文件并针对它们全部使用单独功能的问题,我会对其进行调查。 PS:属性错字固定:) – Petar
@ pe60t0 - 如果您确实需要泛型,请删除模式验证,并将GPX数据视为格式良好的XML。 –
@ pe60t0 - 此外,您可能最终不得不针对GPX输入中的特定变体进行编码。一些变体不应该要求任何特殊的代码(例如以不同顺序的元素)。 –
模式问题,正如您已经很好地指出的那样,并不是所有的实现都是标准化的,有些是完全专有的。在这些情况下,最好的方法是将文件导入到程序中并将其保存为GPX(即使原始文件为GPX)。
我使用一个名为GPS TRACKMAKER的免费程序,可以打开并保存为各种格式,包括GPX。它还直接从各种手持GPS设备(garmin,magellan等)下载数据。下载GPSTM http://www.gpstm.com/dwlpage.php
在链接的文章,我上传了准系统PHP DOM从GPX解析的作品相当不错GPX parsing patterns and "standards"
感谢名单,以奥迪隆费雷拉少年(GPSTM作者)的提供(与GPSTM产生GPX 100%兼容)这样一个优秀的免费工具。
由于Homer6已经提到,一个问题是XML文件中的标签序列。
在我继续之前,请注意GPX 1.0和GPX 1.1有很大不同。大多数应用程序生产/消费GPX 1.0。在1.0中,例如,对于电子邮件中的正则表达式:
[\p{L}_]+(\.[\p{L}_]+)*@[\p{L}_]+(\.[\p{L}_]+)
如果任何应用程序有一个文本字段,要求用户输入他的电子邮件(这将在后面的GPX文件存储)它应该对此非常严格。如果用户输入“名称AT gmail.com”,则生成的GPX文件无效。
XML文件的模式非常严格。大多数应用程序开发人员不希望在用户输入将存储在GPX文件中的数据时进行相同的验证。这就是为什么大多数文件不是正确的GPX文件。而且,这也是大多数分析应用程序忽略这些严格规则的原因。
您能否将您的无效文件发布到gist或其他一些pastebin中? – Homer6
没有什么特别的。问题在于跟踪点的子元素和时间顺序错误,这是GPX模式不允许的错误 – Petar