使Xerces-for-Android能够使用DocumentBuilderFactoryImpl和TransformerFactoryImpl
问题描述:
我需要将XML文件解析为DOM。我也想根据XSD模式验证这一点,并且能够使用变换器将其与XSL样式表进行转换。虽然这可以作为一个普通的Java应用程序运行良好,但我有严重的问题试图让它在Android上运行。使Xerces-for-Android能够使用DocumentBuilderFactoryImpl和TransformerFactoryImpl
- 首先,我不得不发现Android DOM parser is hard-coded to refuse validation。这就是为什么我决定尝试使用Xerces而不是原生的Android XML支持。
- 要让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。
-
正如指出的那样,这个库可以导致
NoClassDefFoundError
与各种类。在我的应用程序中,我遇到了这个问题-
DocumentBuilderFactory.newInstance()
(它需要DocumentBuilderFactoryImpl
)。 -
TransformerFactory.newInstance()
(需要TransformerFactoryImpl
)。
-
有没有什么建议如何使Xerces的换工作的Android与这些?
答
对于DocumentBuilderFactoryImpl
的问题,因为缺少类是Xerces的换Android包的一部分,只是没有自动发现,似乎有两种可能的解决方法:
- 作为建议here,人们可能尝试使用允许自动找到该类的更新设置来重建该jar。
-
由于
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
的工作版本存在坚持,但具有其他不足之处,例如,noDOMImplementationLS
for serialization) - 或者,如果验证是至关重要的,仍然使用Android实现了几乎一切,只是使用Xerces的换Android的一个自包含验证步骤,
- 或使用Xerces- for-Android几乎适用于XSL tr ansformation。为此,我似乎需要首先输出Xerces DOM以流/缓存文件,然后使用Android Transformer应用转换,然后将结果流解析回Xerces的DOM表示。
所有这些看起来缺乏功能或提供笨拙的解决方法,因此欢迎任何关于完全正常工作的Xerces-for-Android库或不同选项的建议。