DOM4J好在哪裏

[size=large][b]JAXP(Java API for XML Parsing)[/b][/size]
Sun(現在屬於oracle)提供的一套操作解析和操作XML文檔的接口,主要包括三個包:
[list]
[*]javax.xml包及子包: 用來獲取解析器,並解析文檔。
[*]org.w3c.dom包及子包: 使用DOM操作XML需要的接口
[*]org.xml.sax包及子包: 使用SAX操作XML需要的接口[/list]
JAXP可以分成兩部分看,第一部分是獲取解析器並解析文檔,第二部分是對解析的文檔進行操作。下面主要分析JAXP是如何獲取解析器的,例子:
	// 獲取DOM解析器並解析文檔
// 此後就是使用org.w3c.dom包的接口來操作Document了
DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
DocumentBuilder builder = factory.newDocumentBuilder();
Document doc = parser.parse(filename);

	// 獲取SAX解析器並解析文檔
// 此後就是使用org.xml.sax包的接口來操作了
SAXParserFactory factory2 = SAXParserFactory.newInstance();
SAXParser parser = factory2.newSAXParser();
System.out.println(parser.getClass());
parser.parse(new File("d:\\xml\\table.xml"), new MyHandler());

由上面可以看到,JAXP中DOM和SAX獲取解析器的步驟是相似的,查看實現可以瞭解其內部有一個查找過程,如果用戶不進行任何修改,JDK1.6會默認綁定apache的Xerces。

[size=large][b]DOM4J[/b][/size]
提到java的XML解析,大家都會想到DOM4J,那麼DOM4J和JAXP有什麼關係呢?

通過研究DOM4J 2.0的源碼發現,DOM4J使用JAXP來獲取解析器,然後通過自己定義的接口來操作解析後的文檔,也就是說DOM4J和JAXP僅僅在操作文檔上接口不同,JAXP使用的是org.w3c.dom和org.xml.sax,而DOM4J使用的是自定定義的一套接口。看DOM4J例子

	// 使用JAXP獲取DOM解析器並解析文檔
DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
DocumentBuilder builder = factory.newDocumentBuilder();
org.w3c.dom.Document Document doc = parser.parse(filename);

// 對Document進行接口轉換,轉換成自己定義的Document接口
DOMReader reader = new DOMReader();
org.dom4j.Document doc = reader.read(doc2);

	// SAX的例子
File f = new File("d:\\xml\\table.xml");
SAXReader reader = new SAXReader();
org.dom4j.Document Document doc = reader.read(f);

上面DOM操作的例子比較容易看懂,使用JAXP解析了文檔後,再使用SAXReader對將org.w3c.dom.Document轉換成org.dom4j.Document接口。以後對文檔的操作就是org.dom4j.Document的事情了。

SAX的例子比較特別點,通過看DOM4J的源碼,最後在SAXHelper類中發現了下面一句:
reader = createXMLReaderViaJAXP(validating, true);
就比較清楚了,SAX也是通過JAXP來獲取解析器的。

[color=red][size=medium]不管是DOM還是SAX,在解析文檔後,最終都轉換成了org.dom4j.Document接口,這樣的好處是很明顯的: 如果程序之前使用DOM解析器,由於某種原因想換成SAX解析器,只需修改獲取解析器部分的代碼,後面對文檔的操作代碼是不需要改動的,而JAXP就不行,因爲org.w3c.dom和org.xml.sax的接口是不一樣的。

分析到這裏,連我自己都有些疑惑了,個人認爲:DOM4J的優勢在於DOM和SAX訪問接口的統一,而解析文檔則共用的JAXP這部分。但是上網google一下都說DOM4J性能好,如果說DOM4J性能好,那到底快在哪裏? 這個問題沒有想明白。不知道誰研究過這個問題,學習一下。[/size][/color]

[size=large][b]附: 如何配置JAXP的解析器:[/b][/size]
A 如何對JAXP SAX解析器進行配置:
1 程序中設置javax.xml.parsers.SAXParserFactory屬性,例如
System.setProperty("javax.xml.parsers.SAXParserFactory", "org.apache.xerces.jaxp.SAXParserFactoryImpl");
2 運行時使用-D參數
java -Djavax.xml.parsers.SAXParserFactory=org.apache.xerces.jaxp.SAXParserFactoryImpl
3 JAVA_HOME\JRE\lib下建立一個文件jaxp.properties,加入一行
javax.xml.parsers.SAXParserFactory=org.apache.xerces.jaxp.SAXParserFactoryImpl
4 查找解析器jar文件的META-INF\services目錄, 在此目錄下如果含有
javax.xml.parsers.SAXParserFactory文件,則通過此文件的內容加載解析器。
5 缺省解析器,1.6是xerces

其中DOM4J就是通過第四條,引入pull-parser jar包,並且在包中的META-INF\services目錄加入javax.xml.parsers.SAXParserFactory文件來配置SAX解析器的。

B 如何對JAXP DOM解析器進行配置:
步驟和上面類似,不過設置的屬性是javax.xml.parsers.DocumentBuilderFactory。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章