使Xerces-for-Android能够使用DocumentBuilderFactoryImpl和TransformerFactoryImpl

使Xerces-for-Android能够使用DocumentBuilderFactoryImpl和TransformerFactoryImpl

问题描述:

我需要将XML文件解析为DOM。我也想根据XSD模式验证这一点,并且能够使用变换器将其与XSL样式表进行转换。虽然这可以作为一个普通的Java应用程序运行良好,但我有严重的问题试图让它在Android上运行。使Xerces-for-Android能够使用DocumentBuilderFactoryImpl和TransformerFactoryImpl

  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。所以我遵循了几个贡献者重复使用Xerces-for-Android library on Google Code的建议。注意:由于Google代码已关闭,因此它现在已移植到(当前相同)Xerces-for-Android library on Github
  3. 正如指出的那样,这个库可以导致NoClassDefFoundError与各种类。在我的应用程序中,我遇到了这个问题

    • DocumentBuilderFactory.newInstance()(它需要DocumentBuilderFactoryImpl)。
    • TransformerFactory.newInstance()(需要TransformerFactoryImpl)。

有没有什么建议如何使Xerces的换工作的Android与这些?

对于DocumentBuilderFactoryImpl的问题,因为缺少类是Xerces的换Android包的一部分,只是没有自动发现,似乎有两种可能的解决方法:

  1. 作为建议here,人们可能尝试使用允许自动找到该类的更新设置来重建该jar。
  2. 由于newInstance()还提供了一个重载版本,它允许直接指定缺少的包,我发现了更简单的方法是简单地手动输入路径:

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

对于TransformerFactoryImpl,事情似乎更复杂。默认设置指向一个本地Java类,com.sun.org.apache.xalan.internal.xsltc.trax.TransformerFactoryImpl,我找不到包含在Xerces for Android中的任何等价物。所以,除非我想尝试提取和重新包装这个依赖的Java TransformerFactoryImpl类和所有其他本机类,否则我会陷入这里。

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

  • 要么放弃整个架构验证,并与Android实现(其TransformerFactoryImpl的工作版本存在坚持,但具有其他不足之处,例如,no DOMImplementationLS for serialization
  • 或者,如果验证是至关重要的,仍然使用Android实现了几乎一切,只是使用Xerces的换Android的一个自包含验证步骤,
  • 或使用Xerces- for-Android几乎适用于XSL tr ansformation。为此,我似乎需要首先输出Xerces DOM以流/缓存文件,然后使用Android Transformer应用转换,然后将结果流解析回Xerces的DOM表示。

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