2012-04-23 98 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