Android上的XMLSchema验证

时间:2012-04-23 03:46:38

标签: android xsd xsd-validation jdom

我维护JDOM project,我正在尝试在Android上'认证'它。大多数工作都很好,但XML Schema验证证明是有问题的......

我的问题是:有没有办法在Android上进行XMLSchema验证?如果有,怎么样?

之前已经问过这样的问题,但没有给出确凿的答案:

这就是我目前所知道的(如果我错了,请纠正我)......:

  • SchemaFactory.newInstance(“http://www.w3.org/2001/XMLSchema”) - 失败并出现IllegalArgumentException
  • 来自Harmony项目的Android中的默认“ExpatParser”不支持XMLSchema验证。
  • 可以在Android应用中加载Xerces,甚至可以解析它,但不要执行验证解析 - 当您尝试获取“致命”Android异常时会导致应用程序崩溃。< / LI>

我一直在研究这个问题已有一段时间了,我已将以下'研究'放在一起:

如果有人在Android上有任何关于XMLSchema验证的信息,我会非常感谢任何输入。

如果有人成功地对XML进行了XMLSchema验证并且可以帮助我获得适用于JDOM的功能,那么他们将获得数千个互联网点...... ;-)并将在JDOM代码中永生化并提交消息。

3 个答案:

答案 0 :(得分:2)

我很着迷,几年后,这仍然是一个悬而未决的问题。 但是,似乎只有坏消息。根据{{​​3}}架构验证目前似乎不支持标准的Android API,谷歌似乎不愿意修复它:

  

我们的XML API(包括SAX,XmlPull和DOM)不支持任何   以下内容:

 XML Schema 

 XML DTDs (including external entity declarations and references)
 validation

 element content whitespace

但是,同一张故障单的一个评论者引用AOSP Issue Tracker,并使用Xerces端口提供示例代码。我不知道这是否超出了你的想法,到目前为止,但我希望它有所帮助。

将其包装起来: workaround只知道以下架构定义:

使用任何其他模式定义会导致它失败(但它会在调试级别上记录它)。显然,对于您来说就是这种情况,因为您正在使用另一个对2011架构的引用。因此,“正确”引用模式定义应解决此问题。

答案 1 :(得分: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);

请不要忘记异常处理。

答案 2 :(得分:-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源中的函数。一种更简单的方法就是构建 rnv for Android,使用NDK然后用参数调用它的可执行文件。

这样的东西
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