2012-04-23 100 views
16

我維護JDOM project,我試圖在Android上「驗證」它。大多數事情工作正常,但XML架構驗證證明是有問題的...Android上的XMLSchema驗證

我的問題是:有沒有辦法在Android上進行XMLSchema驗證?如果有,如何?

類似這樣的問題已經被問過,但沒有確鑿的答案給出:

這是我目前「知道」(糾正我,如果我錯誤)...:

  • SchemaFactory.newInstance(「http://www.w3.org/2001/XMLSchema「) - 由於IllegalArgumentException而失敗
  • Android中Harmony項目的默認'ExpatParser'不支持XMLSchema驗證。
  • 可以在Android應用程序中加載Xerces,甚至解析它,但不會執行驗證解析 - 當您嘗試獲取導致應用程序崩潰的「致命」Android異常時。

我一直在這一段時間,現在,我已經把下面的 '研究':

如果任何人有任何更多關於Android上XMLSchema驗證的信息我將非常感謝任何輸入。

如果有人已經成功完成了XML的XMLSchema驗證,並且可以幫助我獲得適用於JDOM的功能,他們將獲得數千個互聯網點...... ;-),並且將在JDOM代碼和提交消息中不朽。

+0

試試這個http://stackoverflow.com/questions/9998134/validate-xml-against-schema-on-android-using-xerces – LeoMobDev 2013-12-09 14:44:01

回答

-1

我想你可以使用RelaxNG - 有很多驗證器可用。 http://relaxng.org/#validators

特別感興趣的應該是 - http://www.kohsuke.org/relaxng/bali/doc/ - https://msv.java.net/ - http://www.davidashen.net/rnv.html

後者是C實現,前兩個是用Java編寫的。

如果您需要高性能,您可以編寫一些JNI代碼並在rnv源代碼中調用 函數。更簡單的方法是使用NDK爲Android構建 rnv,然後使用參數調用它的可執行文件。

喜歡的東西

Process p = Runtime.exec("/path/to/rnv/exec", [valdidationDoc: String, some more params]); 
OutputStream out = p.getOutputStream(); // connected to STDIN of p 
InputStream in = p.getInputStream(); // connected to STDOUT of p 
out.write(new FileInputStream("/path/to/xml")); 

/// read in for succes/errors 
+0

謝謝你看看。我明確詢問了XMLSchema驗證。建議RelaxNG不會幫助我針對XMLSchemas進行驗證。 – rolfl 2014-02-17 21:03:33

+0

糟糕的一天?不,不是一個糟糕的一天。感謝您的詢問。我認爲你錯過了我的問題中第一句話的含義。 JDOM是一個純java庫,不能引入非java的依賴關係。建議JNI或外部對Java解決方案沒有幫助。 – rolfl 2014-02-17 21:31:14

+0

xmllint呢? http://xmlsoft.org/xmllint.html – fabian 2014-02-17 21:32:14

0

我使用

javax.xml.parsers.DocumentBuilder; 
javax.xml.parsers.DocumentBuilderFactory; 
javax.xml.parsers.ParserConfigurationException; 

如果你有,你可以通過分析它一個XML字符串:

Document doc = null; 
DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance(); 
DocumentBuilder db = dbf.newDocumentBuilder(); 
InputSource is = new InputSource(); 
is.setCharacterStream(new StringReader(xml)); 
doc = db.parse(is); 

請不要忘了異常處理。

+1

該op明確要求對模式進行驗證,而不僅僅是解析! – juwi 2014-09-27 16:51:13

2

我很着迷,幾年後,這仍然是一個懸而未決的問題。但是,似乎只有壞消息。按照AOSP Issue Tracker模式驗證目前不支持似乎與標準Android API和谷歌似乎不願意解決它:

我們的XML API(包括SAX,XmlPull和DOM)不支持任何 的下面:

XML Schema 

XML DTDs (including external entity declarations and references) 
validation 

element content whitespace 

然而,相同票的一個評論引用workaround,並提供了使用的Xerces端口示例代碼。到目前爲止,我不知道這是否超出了你的想法,但我希望它有幫助。

爲了結束這件事: 的SchemaFactoryFinder只知道下面的模式定義:

使用任何其他模式定義原因它會失敗(但它會記錄在調試級別)。顯然,對於您來說,您正在使用2011架構的另一個參考。因此,「正確」引用Schema Definition應該可以解決這個問題。

+1

有趣的更新,我試圖消化你在那裏......它似乎只是一個加密庫的鏈接,在內部重建一個完整的Xerces解析器作爲依賴。這是一個困境,因爲它需要拉取現有項目的一個子集,並且還需要我維護完整的解析器。至少據我所知,這是一個有趣的領先,但並非解決方案。 – rolfl 2014-09-27 17:31:17

+0

是的,我想。再次檢查我們的代碼庫。我們在這裏和那裏做了一些XML解析,但是沒有驗證發生在任何地方。到目前爲止,我還沒有真正包裹我的頭。 去檢查在libcore中的實際實現,看看有什麼 – juwi 2014-09-27 17:42:31

+0

其實...我想我找到了問題: https://android.googlesource.com/platform/libcore/+/master/luni/src /main/java/javax/xml/validation/SchemaFactoryFinder.java Line 237ff。 – juwi 2014-09-27 17:56:38