如何强制使用特定的XML解析器

时间:2010-07-23 08:46:55

标签: java xml parsing

我的应用程序的类路径中都有Xerces和Oracle XML解析器(不要问为什么)。

当我创建新的javax.xml.parsers.DocumentBuilderFactory时,类加载器会自动选择Oracle XML解析器。但是,它不是一个完整/正确的实现,所以它给我带来了麻烦。

在构建文档构建器工厂时,有没有办法可以强制/告诉类加载器使用Xerces parces?

3 个答案:

答案 0 :(得分:5)

对于我的大型项目,skaffman的答案在大部分时间都有效,但不是所有时间,因为我们有多个依赖于这些库的子项目。我们查看了javax.xml.transform.TransformerFactory.newInstance()的源代码,发现它使用了javax.xml.transform.FactoryFinder.find(“javax.xml.transform.TransformerFactory”,...)。然后,此方法查看系统参数以确定正确的实现。

我们最终通过向运行时添加-D参数来强制使用正确的类来修复它:

-Djavax.xml.transform.TransformerFactory = org.apache.xalan.processor.TransformerFactoryImpl -Djavax.xml.parsers.SAXParserFactory = org.apache.xerces.jaxp.SAXParserFactoryImpl -Djavax.xml.parsers.DocumentBuilderFactory = org.apache.xerces.jaxp.DocumentBuilderFactoryImpl

答案 1 :(得分:3)

DocumentBuilderFactory有一个newInstance()方法,您可以在其中指定要使用的实现的类名。

答案 2 :(得分:0)

我也遇到类似的情况,但是我们的代码使用org.xml.sax.helpers.XMLReaderFactory.createXMLReader()创建了sax解析器(在8u162中仍然存在错误)。

可以使用system属性解决此问题 -Dorg.xml.sax.driver=org.apache.xerces.parsers.SAXParser