1

我以前使用本地 Java 1.6 Stax 解析器用 Java 编写了一个库。但是,我现在想将此库用于 Android,这意味着不支持此解析器。我想使用 Woodstox,因为它实现了 Stax 1.0 api,我不必重写我当前的任何代码,只需在依赖项中添加。

Android 没有 stax 1 api,所以我意识到我必须添加它。现在,我已将 woodstox-core-asl-4.2.0.jar、stax-api-1.0-2.jar 和 stax2-api-3.1.3.jar 添加到类路径中。一切都编译得很好,但是当我真正尝试运行一个依赖于这个库的 Android 应用程序时,我得到运行时错误,表明它没有使用 Woodstox 作为 stax 1 api 的实现。

我有什么误解或做错了吗?我错过了一个罐子吗?我已经彻底阅读了Woodstox 帮助页面,但找不到我遗漏的任何其他内容。

编辑:我开始怀疑是否真的可以在 Android 上使用 Woodstox。问题在于对 stax api 的依赖。经过一些研究后,我发现 Dalvik VM 似乎无法接受那些位于 javax.* 命名空间中的包。

4

1 回答 1

0

你如何通过XMLInputFactory/XMLOutputFactory实例?通常最好直接构造实例 (of WstxInputFactory, WstxOutputFactory),因为 callign 没有真正的好处XMLInputFactory.newInstance():最多它会增加开销(慢得多,扫描类路径)。

您不会错过任何罐子:始终需要 core 和 stax2-api;如果平台不包含 Stax API jar(Android 出于某种奇怪的原因不包含,即使它是 JDK 1.6 的一部分),那么就是那个。

编辑

自动发现应该基于几件事:

  1. XMLInputFactory(等)检查匹配的系统属性(“javax.xml.stream.XMLInputFactory”)是否有值;这是要使用的工厂的类名(如果有)。因此您可以使用特定的 impl 值设置系统属性
  2. 如果没有找到系统属性,查看是否有资源META-INF/services/javax.xml.stream.XMLInputFactory可以读取;一行与类名
  3. 如果两者都不起作用,请尝试创建默认实例;对于 J2SE SDK,这将是 Oracle 提供的实现 (Sjsxp)

Woodstox 提供 SPI 信息(步骤 2)以自动注册自身。但是由于在 Android 上你重新打包了 jars(作为 Android 包,APK?),资源文件可能不包括在内,或者找不到。如果这是根本原因,您仍然可以设置匹配的系统属性。如果没有,您将需要使用其他方式提供类名或工厂实例。

于 2013-12-04T20:17:30.403 回答