2011-11-29 107 views
0

我正在構建一個主要以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文件。如果你有一個想法,請在那裏發表你的答案。

+0

您能否將您的無效文件發佈到gist或其他一些pastebin中? – Homer6

+0

沒有什麼特別的。問題在於跟蹤點的子元素和時間順序錯誤,這是GPX模式不允許的錯誤 – Petar

回答

0

爲什麼?:geocaching.com生成具有特定架構擴展名的.gpx文件,它們已經定義。

GSAK還增加了「價值」gpx文件。恐怕,gpx世界並不是標準化的。

這些東西都不是您正在使用的模式的一部分。換句話說,您對嚴格模式檢查的想法存在問題。

這是他們,不是你。但你被迫容納「他們」。

+0

如果我錯了,請糾正我,但生成具有特殊架構擴展名的.gpx文件不會阻止它符合標準.GPX模式。它也必須對擴展模式有效。不過,正如你所說,我嚴格的模式檢查有問題(我認爲),你能告訴我你如何解析GPS文件嗎? – Petar

1

模式作者選擇使用<xs:sequence>而不是<xs:all>。 XSD序列是特定於訂單的。

拼寫錯誤的屬性名稱將是無效輸入。你必須優雅地驗證和失敗。計算機模糊不清。

希望可以幫助...

更新:

對不起,請允許我詳細說明。該問題由架構的作者和GPX輸出作者(各種軟件包和設備)創建。

基本上,如果一個人可以看一塊數據並理解它的含義,那麼軟件實施者就有責任創建靈活的驗證,以便該程序可用。

例如,假設您有一個輸入字段,您應該輸入美元金額,並且用戶輸入「$ .05」,則該軟件應該足夠聰明,可以識別出5美分和足夠智能認識到前面有一個空間,而且沒用。

這同樣適用於來自設備的文件。是的,這個問題是由他們創造的。是的,當對格式有完美的嚴格定義時,必須將設備的輸出作爲用戶輸入來處理是很荒謬的。但這是你目前面臨的問題。而在這一天結束時,沒有人關心你必須克服哪些技術挑戰才能使其發揮作用。他們關心的只是「它是否有效」和「這對我有多大用處」。

因此,如果您看到這些字段出現故障,但除此之外所有所需的數據都存在,請重新排列這些字段以使它們通過驗證。讓您的導入更爲靈活。如果缺少缺口,填寫數據中的空白並附帶警告消息。但是,讓它工作。

除了在根據XSD對數據進行驗證之前嘗試按摩數據之外,您還可以執行其他操作,如果您發現驗證錯誤始終僅由字段順序引起(這是XSD中常見的誤解xs:sequence和xs:all),就是改變你的XSD。從序列切換到全部。你可以先試試官方的XSD。如果它通過了,那麼你將不必驗證更寬鬆的版本。

我希望幫助...

+0

謝謝,但這不是我的問題的答案。問題是人們爲什麼會產生這樣的含糊不清,因爲他們不這樣做絕對沒有問題。 – Petar

+0

對不起,混淆了......我希望這更有意義...... – Homer6

+0

你的答案現在更有意義,我對此深表感激。我很高興你同意我的看法,只是部分地遵守嚴格的定義是沒有意義的。你提出的解決問題的建議都很好。我擔心的是這樣一個事實,那就是有很多gpx生產設備,如果你想使你的系統具有通用性,就不可能支持它們生成的所有不同版本的gpx。所以,如果你特別處理了GPX解析,請告訴我你是如何做到的。 – Petar

0

所以,事實證明,有一些GPS設備/ GPS記錄 系統的/ etc。這些文件生成的.gpx文件不符合 官方GPX模式。這個結論讓我問這個問題: 爲什麼?我嚴重不理解背後的想法。此外, 大多數我已經找到了無效的文件,問題不是 的東西,可以被視爲一個額外的功能,但 像不繼與某些屬性 孩子,我認爲是正確的順序完全愚蠢。

我能想到的唯一事情就是在驗證之前預處理GPX輸入(此時唯一的要求是GPX數據格式良好)。

我會使用以身份轉換開始的XSLT來通過一切通過不變。然後,您可以通過剝離具有特定名稱空間的所有內容來覆蓋身份轉換。你也可以強制執行子元素的順序(屬性沒有子元素,所以我認爲這是一個錯字)並且糾正拼寫錯誤的元素/屬性名稱。

+0

感謝您的建議。是的,一種選擇是在驗證之前預處理GPX。問題是我想讓我的程序通用 - 使用任何GPX文件輸入。但是,我不知道XSLT和您建議的方法。如果它能夠解決不得不處理許多不同版本的GPX文件並針對它們全部使用單獨功能的問題,我會對其進行調查。 PS:屬性錯字固定:) – Petar

+0

@ pe60t0 - 如果您確實需要泛型,請刪除模式驗證,並將GPX數據視爲格式良好的XML。 –

+0

@ pe60t0 - 此外,您可能最終不得不針對GPX輸入中的特定變體進行編碼。一些變體不應該要求任何特殊的代碼(例如以不同順序的元素)。 –

0

模式問題,正如您已經很好地指出的那樣,並不是所有的實現都是標準化的,有些是完全專有的。在這些情況下,最好的方法是將文件導入到程序中並將其保存爲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%兼容)這樣一個優秀的免費工具。

0

由於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文件。而且,這也是大多數分析應用程序忽略這些嚴格規則的原因。