让 Xerces-for-Android 与 DocumentBuilderFactoryImpl 和 TransformerFactoryImpl 一起工作
Getting Xerces-for-Android to work with DocumentBuilderFactoryImpl and TransformerFactoryImpl
我需要将 XML 文件解析为 DOM。我还想根据 XSD 模式对此进行验证,并能够使用 t运行sformer 将其转换为 XSL 样式 sheet。虽然这作为一个普通的 Java 应用程序运行良好,但我在尝试让它在 Android.
上运行时遇到了严重的问题
- 首先,我必须发现 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. 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。
正如那里所指出的,这个库可以导致 NoClassDefFoundError
和各种 类。在我的应用程序中,我 运行 使用
解决了这个问题
DocumentBuilderFactory.newInstance()
(需要 DocumentBuilderFactoryImpl
)。
TransformerFactory.newInstance()
(需要 TransformerFactoryImpl
)。
关于如何让 Xerces-for-Android 使用这些有什么建议吗?
对于 DocumentBuilderFactoryImpl
的问题,因为缺少的 class 是 Xerces-for-Android 包的一部分,只是没有自动找到,似乎有两个可能的修复:
- 按照建议 here,可以尝试使用允许自动找到 class 的更新设置重建 jar。
由于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 库或不同选项的建议。
我需要将 XML 文件解析为 DOM。我还想根据 XSD 模式对此进行验证,并能够使用 t运行sformer 将其转换为 XSL 样式 sheet。虽然这作为一个普通的 Java 应用程序运行良好,但我在尝试让它在 Android.
上运行时遇到了严重的问题- 首先,我必须发现 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. 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。
正如那里所指出的,这个库可以导致
解决了这个问题NoClassDefFoundError
和各种 类。在我的应用程序中,我 运行 使用DocumentBuilderFactory.newInstance()
(需要DocumentBuilderFactoryImpl
)。TransformerFactory.newInstance()
(需要TransformerFactoryImpl
)。
关于如何让 Xerces-for-Android 使用这些有什么建议吗?
对于 DocumentBuilderFactoryImpl
的问题,因为缺少的 class 是 Xerces-for-Android 包的一部分,只是没有自动找到,似乎有两个可能的修复:
- 按照建议 here,可以尝试使用允许自动找到 class 的更新设置重建 jar。
由于
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
的工作版本,但它有其他缺点,例如 noDOMImplementationLS
for serialization), - 或者,如果验证很重要,仍然对几乎所有内容使用 Android 实现,只需使用 Xerces-for-Android 进行独立验证步骤,
- 或将 Xerces-for-Android 用于除 XSL 转换之外的几乎所有内容。为此,我似乎需要先将 Xerces DOM 输出到 stream/cache 文件,然后使用 Android 转换器应用转换,然后将结果流解析回 DOM Xerces 的表示。
所有这些似乎要么缺乏功能,要么提供笨拙的解决方法,因此欢迎任何关于完全工作的 Xerces-for-Android 库或不同选项的建议。