本文主要是介绍JDK中JAXP寻找XML解析器的顺序,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
[转自:追求->Permalink的 星期三 2007年03月28日]
工作中,使用JAVA的JAXP读取解析XML文件中,就碰到了一件奇件的事。在Web工程中,调试发现JAXP实际使用的是Xerces解析器,
可是,当将工程中的一个小Swing工具,与Web使用一样的jar包,打成一个可执行的jar包时,调试却发现JAXP实际使用的是Crimson
解析器,还会发现解析XML文件时出现错误,经过分析,发现Crimson解析器是Sun公司开发的(实际使用发现Crimson没有Xerces解析器稳定),
打包在JAVA_HOME/lib/dt.jar包中,这个dt.jar被设置在环境变量CLASSPATH中了,当运行可执行的jar包是,JAXP会使用CLASSPATH的解析器,
在Web工程中的War包则不会。
通过阅读JDK源码javax.xml.parsers.FactoryFinder,javax.xml.parsers.SAXParserFactory以及DocumentBuilderFactory发现JDK按照如下顺序:
1 系统属性javax.xml.parsers.DocumentBuilderFactory或javax.xml.parsers.SAXParserFactory
2 在jdk-dir/lib/jaxp.properties中设定的javax.xml.parsers.DocumentBuilderFactory或javax.xml.parsers.SAXParserFactory属性
3 运行时jar包中META-INF/services/javax.xml.parsers.DocumentBuilderFactory或javax.xml.parsers.SAXParserFactory文件中设定的值
4. 如果上面的解析器都没有找到,则使用Crimson。如果还没有。。。。。。那报ClassNotFound异常了。
通过JAXP查找解析器的顺序,我们可以使用下面方式来决定,我们使用的实际解析器,
1 在程序中写死实际的解析器
如
javax.xml.parsers.DocumentBuilderFactory factory= new org.apache.crimson.jaxp.DocumentBuilderFactoryImpl();
2 使用JAXP的 DocumentBuilderFactory 工厂类,如
javax.xml.parsers.DocumentBuilderFactory factory= javax.xml.parsers.DocumentBuilderFactory.newInstance();
再通过下面的方式来指定实际的解析器类
方法一:在运行java时,通过设置java -D javax.xml.parsers.DocumentBuilderFactory=new org.apache.crimson.jaxp.DocumentBuilderFactoryImpl
方法二:在程序中调用System.setProperty(“javax.xml.parsers.DocumentBuilderFactory”,” org.apache.crimson.jaxp.DocumentBuilderFactoryImpl”)
来设定实际的XML解析器.
方法三:编写一个jaxp.properties文件,在其中加入如下内容
javax.xml.parsers.DocumentBuilderFactory=org.apache.crimson.jaxp.DocumentBuilderFactoryImpl
再将此文件放入JAVA_HOME/lib/下
方法四:在打jar包下,在目录META-INF/下新建一个services目录,在此目录新建一个文件名为javax.xml.parsers.DocumentBuilderFactory的文件,
文件内容写上实际使用的解析器类,如写org.apache.crimson.jaxp.DocumentBuilderFactoryImpl
通过,上面,我们就可以对JAXP有一个比较深的了解。其实,JAVA中有许多这种思想的做法,这种思想,指的是什么的,就是平台无关性,发展到不依赖于具体的实现。
如我们熟悉的JNDI,JDBC,JAXP等。JNDI是抽像各种目录服务操作的类库,因为目录服务器厂商太多了,如SUN公司的ldapsdk,还有novell公司等等。JDBC是抽像各种数据库
操作的类库,因为数据库厂商也太多了,如ORACLE,SQLSERVER,MYSQL,INFORMIX等等,JAXP就是抽像各种XML解析器和转换器产品的类库,因为XML解析器和转换器产品够多
的了。
这篇关于JDK中JAXP寻找XML解析器的顺序的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!