1. 程式人生 > >JDK中JAXP尋找XML解析器的順序

JDK中JAXP尋找XML解析器的順序


工作中,使用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解析器和轉換器產品夠多
的了。