17

我维护JDOM 项目,并试图在 Android 上“认证”它。大多数事情都很好,但是 XML Schema 验证被证明是有问题的......

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

以前有人问过这样的问题,但没有给出确凿的答案:

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

  • SchemaFactory.newInstance(" http://www.w3.org/2001/XMLSchema ") - 因 IllegalArgumentException 而失败
  • Harmony 项目中 Android 中的默认“ExpatParser”不支持 XMLSchema 验证。
  • 可以在 Android 应用程序中加载 Xerces,甚至使用它进行解析,但不能进行验证解析 - 当您尝试获得导致应用程序崩溃的“致命”Android 异常时。

我已经为此工作了一段时间,并整理了以下“研究”:

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

如果有人成功地在 XML 上完成了 XMLSchema 验证,并且可以帮助我获得适用于 JDOM 的功能,他们将获得数千个 Internet 点... ;-) 并将在 JDOM 代码和提交消息中永垂不朽。

4

3 回答 3

2

我很着迷,几年后,这仍然是一个悬而未决的问题。不过,似乎只有坏消息。根据AOSP 问题跟踪器模式验证,目前标准的 Android API 似乎不支持,谷歌似乎不愿意修复它:

我们的 XML API(包括 SAX、XmlPull 和 DOM)不支持以下任何一种:

 XML Schema 

 XML DTDs (including external entity declarations and references)
 validation

 element content whitespace

但是,同一张票的一位评论者引用了一种解决方法,并提供了使用 Xerces 端口的示例代码。到目前为止,我不知道这是否超出了您的想象,但我希望它有所帮助。

总结一下:SchemaFactoryFinder只知道以下 Schema 定义:

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

于 2014-09-27T17:07:20.157 回答
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);

请不要忘记异常处理。

于 2014-09-09T12:26:21.437 回答
-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
于 2014-02-17T20:25:00.670 回答