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相關技術的介紹地,不管是誰寫的,只要對大家有幫助我就轉過來了,如果作者不同意或者網站不允許,我會將他們取下來。  回復  更多評論   


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


          網站導航:
           
          主站蜘蛛池模板: 台山市| 海淀区| 衡南县| 临潭县| 南平市| 驻马店市| 茌平县| 宜君县| 沧州市| 桃源县| 区。| 丹寨县| 安康市| 崇信县| 建昌县| 夏邑县| 阿勒泰市| 大安市| 宜丰县| 天峨县| 怀来县| 灵璧县| 怀远县| 文安县| 元氏县| 深泽县| 怀仁县| 德钦县| 株洲市| 永吉县| 台中县| 杭锦旗| 凤冈县| 宁海县| 子洲县| 邹城市| 邓州市| 施秉县| 大石桥市| 神农架林区| 龙口市|