让 Xerces-for-Android 与 DocumentBuilderFactoryImpl 和 TransformerFactoryImpl 一起工作

Getting Xerces-for-Android to work with DocumentBuilderFactoryImpl and TransformerFactoryImpl

我需要将 XML 文件解析为 DOM。我还想根据 XSD 模式对此进行验证,并能够使用 t运行sformer 将其转换为 XSL 样式 sheet。虽然这作为一个普通的 Java 应用程序运行良好,但我在尝试让它在 Android.

上运行时遇到了严重的问题
  1. 首先,我必须发现 Android DOM parser is hard-coded to refuse validation。这就是为什么我决定尝试使用 Xerces 而不是原生 Android XML 支持。
  2. 为了让 Xerces 在 Android 上达到 运行,我理解 repackaged version of it is needed to avoid conflicts with the java core libary. So I followed the suggestion repeated by several contributors to use the Xerces-for-Android library on Google Code. Note: Since Google Code is closed, it now has been ported to the (currently same) Xerces-for-Android library on Github
  3. 正如那里所指出的,这个库可以导致 NoClassDefFoundError 和各种 类。在我的应用程序中,我 运行 使用

    解决了这个问题
    • DocumentBuilderFactory.newInstance()(需要 DocumentBuilderFactoryImpl)。
    • TransformerFactory.newInstance()(需要 TransformerFactoryImpl)。

关于如何让 Xerces-for-Android 使用这些有什么建议吗?

对于 DocumentBuilderFactoryImpl 的问题,因为缺少的 class 是 Xerces-for-Android 包的一部分,只是没有自动找到,似乎有两个可能的修复:

  1. 按照建议 here,可以尝试使用允许自动找到 class 的更新设置重建 jar。
  2. 由于newInstance()也提供了一个重载版本,允许直接指定缺少的包,我发现更简单的解决方案是简单地手动输入路径:

    DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance
                      ("mf.org.apache.xerces.jaxp.DocumentBuilderFactoryImpl",null);
    

对于TransformerFactoryImpl,事情似乎更复杂。默认设置指向本机 Java class、com.sun.org.apache.xalan.internal.xsltc.trax.TransformerFactoryImpl,为此我在 Xerces-for-Android 中找不到任何等效项。因此,除非我想尝试提取和重新打包 Java TransformerFactoryImpl class 和所有其他本机 classes 这依赖,我被困在这里。

所以在这一点上,我看到以下解决方案选项:

  • 要么放弃整个模式验证并坚持使用 Android 实现(为此存在 TransformerFactoryImpl 的工作版本,但它有其他缺点,例如 no DOMImplementationLS for serialization),
  • 或者,如果验证很重要,仍然对几乎所有内容使用 Android 实现,只需使用 Xerces-for-Android 进行独立验证步骤,
  • 或将 Xerces-for-Android 用于除 XSL 转换之外的几乎所有内容。为此,我似乎需要先将 Xerces DOM 输出到 stream/cache 文件,然后使用 Android 转换器应用转换,然后将结果流解析回 DOM Xerces 的表示。

所有这些似乎要么缺乏功能,要么提供笨拙的解决方法,因此欢迎任何关于完全工作的 Xerces-for-Android 库或不同选项的建议。