本文主要講述的是Dom4j在把Document保存到文件過程中出現的一個中文問題,文中不足之處歡迎大家批評指教。
Dom4j是一個比較優秀的java開源xml解析項目,支持DOM,?SAX?and?JAXP.,并提供對XPath查詢語言的強大支持。因此,在EasyJF團隊的很多開源項目中,如EasyJWeb、EasyDBO等都是使用Dom4j來處理xml文件相關操作。
?
1、從一個xml文件中載入一個Dom到內存:
FileInputStream?in?=?new?FileInputStream(new?File(fileName));
SAXReader?reader?=?new?SAXReader();
doc?=?reader.read(in);
2、把Dom中的數據寫入到xml文件中
使用Dom4j,要把一個Dom中的數據寫入到文件非常簡單,API如下:
?public?void?write(Writer?writer)?throws?IOException;
因此,假如我們要把一個Document寫入到c:\test.xml文件中,可以簡單的使用下面的代碼即可:
??????? java.io.Writer?wr=?new?java.io.FileWrite(filename);
doc.write(wr);
??????? wr.close();//注意,必須要執行close()方法,才會實現真正的寫入
這種用法也是Dom4j所推薦我們使用的非常簡單的方法。然而,當我們的dom中包含有中文字符數據的時候,這種方法寫入的xml文檔卻無法使直覺打開。會提示類似如下的錯誤:
?org.dom4j.DocumentException:?invalid?byte?1?of?1-byte?UTF-8?sequence?(0xb2)?Nested?exception:?invalid?byte?1?of?1-byte?UTF-8?sequence?(0xb2)
?at?org.dom4j.io.SAXReader.read(SAXReader.java:484)
?at?org.dom4j.io.SAXReader.read(SAXReader.java:343)
?at?
我們可以看生成的xml文件編碼,內容是utf-8的,但文件格式確是ANSI的,如下圖所示:
?

原因分析:
由于FileWriter默認的輸出編碼是ANSI編碼,而Dom4j中的wirte方法提供的內容實際是以UTF-8保存的,因此造成了包括中文字符的XML文件無法正常閱讀。
?
解決方法:
? 不能使用簡單的FileWriter,而應該是使用一個能指定具體輸出編碼的Writer,在JDK的io包中,?OutputStreamWriter可以指定輸出編碼。
正確的代碼如下:
??? java.io.OutputStream?out=new?java.io.FileOutputStream(fileName);
???java.io.Writer?wr=new?java.io.OutputStreamWriter(out,"UTF-8");???
???doc.write(wr);???
???wr.close();
???out.close();
簡化一下可以寫成下面的樣式:
?? java.io.Writer?wr=new?java.io.OutputStreamWriter(new?java.io.FileOutputStream(fileName),"UTF-8");???
???doc.write(wr);???
???wr.close();
小結:
由于大多數優秀的基礎性開源項目都是老外開發,他們不大可能在中文平臺下進行測試,用例數據也很少會使用中文平臺,因此,我們即使按照這些開源項目的通用說明文檔及用戶指南去操作,也會出現很多不可預知的錯誤。這也是為什么本人要參與組建開源團隊EasyJF,提倡搞國產開源,并開發一些基礎性的開源框架如EasyJWeb、EasyDBO的一個初衷。
當然,這里提出的中文問題,算是一個還“沒來得及商量”以及要通過一些罕見的處理才能正確運行的中文問題。因此,同樣歸并到了“中文問題沒商量”系列中。
(注:本文作者,
EasyJF開源團隊 大峽,轉載請保留作者聲明!)