Java, Only Java!

          統計

          留言簿(20)

          積分與排名

          好友空間

          文檔技巧

          閱讀排行榜

          評論排行榜

          Apusic對XML文件處理之分析(轉-請作者與我聯系)

          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

          ?

          posted on 2008-03-06 21:19 zYx.Tom 閱讀(998) 評論(2)  編輯  收藏

          評論

          # re: Apusic對XML文件處理之分析(轉-請作者與我聯系) 2008-03-07 09:53 dennis

          blogjava成了廣告宣傳地和轉帖集中地了?  回復  更多評論   

          # re: Apusic對XML文件處理之分析(轉-請作者與我聯系) 2008-03-07 11:06 朱遠翔-Apusic技術顧問

          @dennis
          感謝你的批評,我主要把這里做為Apusic相關技術的介紹地,不管是誰寫的,只要對大家有幫助我就轉過來了,如果作者不同意或者網站不允許,我會將他們取下來。  回復  更多評論   


          只有注冊用戶登錄后才能發表評論。


          網站導航:
           
          主站蜘蛛池模板: 贵溪市| 宣汉县| 曲水县| 长泰县| 定陶县| 屏边| 理塘县| 玛纳斯县| 泸溪县| 天全县| 夏河县| 尼勒克县| 普陀区| 梨树县| 慈溪市| 安庆市| 汾西县| 广平县| 时尚| 左贡县| 苍山县| 苏尼特右旗| 定陶县| 扎鲁特旗| 岫岩| 揭西县| 安达市| 盐亭县| 安义县| 简阳市| 青河县| 嵊州市| 衡东县| 措勤县| 承德市| 桦甸市| 剑阁县| 榆中县| 馆陶县| 扬中市| 太和县|