【问题标题】:XMLSchema validation on AndroidAndroid 上的 XMLSchema 验证
【发布时间】:2012-05-03 17:03:58
【问题描述】:

我维护JDOM project 并尝试在 Android 上“认证”它。大多数事情都可以正常工作,但 XML Schema 验证被证明是有问题的......

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

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

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

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

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

如果有人有任何关于 Android 上 XMLSchema 验证的更多信息,我将不胜感激。

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

【问题讨论】:

标签: android xsd xsd-validation jdom


【解决方案1】:

令我着迷的是,几年后,这仍然是一个悬而未决的问题。 不过,似乎只有坏消息。根据AOSP Issue Tracker Schema 验证目前似乎不受标准 Android API 的支持,Google 似乎不愿意修复它:

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

 XML Schema 

 XML DTDs (including external entity declarations and references)
 validation

 element content whitespace

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

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

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

【讨论】:

  • 有趣的更新,我正在尝试消化您那里的内容....它似乎只是一个指向加密库的链接,该库在内部将完整的 Xerces 解析器重建为依赖项。这是一个困境,因为它需要提取现有项目的一个子集,并且还需要我维护完整的解析器。这是一个有趣的线索,但不是解决方案,至少据我所知。
  • 是的,我想。还仔细检查了我们的代码库。我们在这里和那里进行一些 XML 解析,但在任何地方都没有进行验证。到目前为止,我还不能真正理解它。去检查 libcore 中的实际实现,看看那里有什么
  • 其实...我想我找到了问题所在:android.googlesource.com/platform/libcore/+/master/luni/src/… Line 237ff。
  • 我编辑了答案以反映我在 Android 源代码中的发现。让我知道这是否能解决问题。
【解决方案2】:

我正在使用

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);

请不要忘记异常处理。

【讨论】:

  • 该操作明确要求对模式进行验证,而不仅仅是解析!
【解决方案3】:

我认为您可以使用 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

【讨论】:

  • 感谢您的浏览。我明确要求 XMLSchema 验证。建议 RelaxNG 不会帮助我验证 XMLSchemas。
  • 糟糕的一天?不,不是糟糕的一天。谢谢你的提问。我认为您错过了我问题中第一句话的含义。 JDOM 是一个纯 java 库,不能引入非 java 依赖项。建议 JNI 或外部到 Java 的解决方案没有帮助。
  • 我明白了,那么“认证”是什么意思?
  • 意味着我可以向 JDOM 用户保证,如果他们使用 JDOM,该功能将起作用,并且它遵循 JDOM 用户所拥有的相同模式/期望(如果不使用,我可以支持/修复)。
猜你喜欢
  • 2011-03-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-11-13
  • 2019-04-21
  • 1970-01-01
  • 2015-04-12
相关资源
最近更新 更多