1
??????????????
前言
本文闡述了
Apusic
對
XML
文件處理的詳細分析,及其現有情況下
Apusic
對
XML
文件解析存在的問題。
2
??????????????
Apusic
如何處理
XML
文件
Apusic
服務器對于
XML
文件解析應該分為兩種情況:一種
Apusic
需要加載的
XML
文件。如
:Apusic
的配置文件,
J2EE
應用的
web.xml,application.xml
文件等。另外一種是用戶代碼中使用
DocumentBuilderFactory
,
SAXParserFactory
來解析自己的
XML
文件。對于上面兩種情況的
XML
文件,
Apusic
是予以不同處理的。以下對此做具體說明。
2.1
????
解析
Apusic
的配置文件及其
J2EE
應用的
web.xml,application.xml…etc
對于這一塊的解析,我們現在是采用自己的
XML
解析器來實現的,我們自己的
XML
解析器就是
com.apusic.xml.parsers
,
com.apusic.xml.reader
下的相關類來處理的,和朱華明討論過,我們對于上述文件采用自己的解析器處理是存在優勢的。因為我們對這些文件的結構很了解。效率應該會高于任何第三方的
XML
解析器。但是我們的解析器可能也會存在一些不足的地方,對于一些復雜的
XML
結構的處理可能會存在問題。由于考慮到效率問題,所以這一塊應該不需要使用第三方的
XML
解析器,還是使用我們自己的解析器為好。
2.2
????
用戶代碼中解析自己的
XML
文件
用戶應用程序使用
DocumentBuilderFactory, SAXParserFactory
對自己的
XML
解析時,由于我們在
Apusic.jar
中,對
META-INF/service/
文件夾下設置了
javax.xml.parsers.DocumentBuilderFactory , javax.xml.parsers.SAXParserFactory
兩個屬性的值,并指向了
Xerces,
所以用戶在解析
XML
時,缺省情況下使用的就是
Xerces API
進行操作的。因此這一塊應該是不會存在問題。
至于設置此屬性后是如何利用
Xerces API
進行解析
XML
的原理,當你閱讀了
Java
相關源代碼后就可以明白。具體可以閱讀
javax.xml.parsers
包下的
DocumentBuilderFactory.class,SAXParserFactory.class
類的
newInstance
方法。
3
??????????????
現存問題分析
現在我們會遇到修改
Apusic
配置文件后,
Apusic
無法啟動的情況。這種情況主要是因為我們使用了自己的
XML
解析器。而我們的解析器在處理
UTF-8
編碼文件時存在問題,因為文本文件在文件的頭部存在
BOM? (Byte Order Mark)
標識
,
而這個
BOM
標識是用來表示文件的字節順序。對于不同編碼格式的文件存在不同的
BOM
標識
,
文件的
BOM
標識規范可以參考下表(表
1
),由于
UTF-8
文件不存在字節順序的問題,所以這個文件
BOM
標識在
UTF-8
編碼方式下是可有可無的。而當我們修改配置文件并保存后,如果存在
BOM
標識,我們的解析器就會出錯,不存在
BOM
標識時,我們的解析器就能夠正確工作。所以我們需要在解析
UTF-8
的時候,判斷頭部是否包含
UTF-8
的
BOM
標識,如果有就需要跳過去。代碼修改主要是在
XmlReader.java
文件中做如下處理:
//skip UTF-8 BOM (byte order mark)
if (count >= 3 && pos == 0){
if (buffer[0] == (byte)0xEF &&
buffer[1] == (byte)0xBB &&
buffer[2] == (byte)0xBF){
pos += 3;
}
}
|
?
UTF-8
|
EF BB BF
|
UTF-16 Big Endian
|
FE FF
|
UTF-16 Little Endian
|
FF FE
|
UTF-32 Big Endian
|
00 00 FE FF
|
UTF-32 Little Endian
|
FF FE 00 00
|
?
(
表
1)
?
為什么我們對
UTF-16,UTF-32
等編碼方式文件存在
BOM
標識時沒有問題呢?其實這個問題應該是
Java
的一個
bug
,
Java
的文本流在處理其他編碼方式的時候能夠很好的處理這個
BOM
標識,但是對于
UTF-8
編碼時不能夠正確處理。該
bug
可以參考以下地址:
http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=4508058
?