<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    冰浪

    哥已不再年輕 - 堅定夢想,畢生追求!
    posts - 85, comments - 90, trackbacks - 0, articles - 3
      BlogJava :: 首頁 :: 新隨筆 :: 聯系 :: 聚合  :: 管理

    使用KXML

    Posted on 2009-04-09 09:39 冰浪 閱讀(376) 評論(0)  編輯  收藏 所屬分類: J2ME

    KXML是一個只占很小存儲空間的XML語法分析程序,對于J2ME應用程序非常適合。它有一個非常獨特的DOM操作方法和被稱為Pull的語法分析方法。

     

    KXML是一個被設計用于J2ME設備的簡化類庫,雖然它也可以被用于其它需要小型XML語法分析程序的環境,比如Applet。KXML是一個Enhydra維護的項目,支持下面的性能:

      · 支持XML名稱空間
      · 用"松散"模式分析HTML或其它SGML格式
      · 占用很少的存儲空間(21 kbps)
      · 基于Pull的分析
      · 支持XML寫操作
      · 可選的DOM支持
      · 可選的WAP支持

      在本文中,我將詳細說明其中的一些特點,尤其是Pull分析和DOM操作,而且我將告訴你如何檢查KXML在內存中操作的效果

     

    使用XML工作

      有兩個常見的使用XML工作的方法:操作DOM或者捕捉語法分析事件。操作DOM是一個與XML相互作用的簡單方法,通常這個XML是一棵完整的XML樹,被解析成一個存放在存儲器中的節點結構,你可以遍歷這棵樹。它非常簡單易用,但是因為整棵樹存在于存儲器中造成存儲器的負擔。

      第二種方法在捕捉語法分析事件中,每當語法分析程序遇到數據中的特定結構,它就會遍歷XML數據,然后把結果發回前面注冊的一個事件監聽器中。比如說,當語法分析程序遇到一個起始標記,如<html>,那么事件監聽器將接收一個事件,通知它這個情況,并且向它傳遞任何所需的信息。實現這種策略的語法分析程序被稱為push語法分析程序,因為這個語法分析程序把事件"推入"一個監聽器中。

      KXML支持DOM語法分析和操作,但是不支持push語法分析。取而代之,它使用一種稍微不同的稱為"Pull"的分析方法。與push語法分析相反,Pull語法分析讓程序員從語法分析程序中"拉"出下一個事件。在push語法分析中,你必須維護你正在分析的當前數據的狀態,然后基于傳送到監聽器的事件,恢復任何以前的狀態,并且當你轉換到一個不同的狀態時保存新的狀態。Pull語法分析使處理狀態改變更加容易,因為你可以發送分析器到不同的函數,維護它們自己的狀態變量。

    Pull語法分析

      讓我們來研究一個例子,看看KXML如何做一個Pull語法分析程序。演示程序名為KXMLDemo_Pull。它將使用一個Pull語法分析程序查看一個包含通訊錄信息的文件。下面給出源代碼中比較重要的幾行,我還給出了注釋。

    1.XmlParser parser = null;
    2......
    3.parser = new XmlParser( new InputStreamReader( 1this.getClass().getResourceAsStream(resfile_name) ));

      第三行創建了一個XmlParser,把它傳到一個InputStream中。這個語法分析程序反復調用,直到出現END_DOCUMENT事件。

    1.while ( (event = parser.read()).getType() != Xml.END_DOCUMENT ) {
    2. ...
    3.if (name != null && name.equals("address")) {
    4. ...
    5. parseAddressTag( parser );

      第三行判斷事件是否以一個<address>標記開始,第五行傳送語法分析器到控制語法分析程序的"parseAddressTag"。

    1.while ((event = parser.peek()).getType() != Xml.END_DOCUMENT) {
    2....
    3. if (type == Xml.END_TAG && name.equals("address")) {
    4. return;
    5. }
    6....
    7. ParseEvent next = parser.read();
    8.
    9. // if it's not a text event then skip it
    10. if (next.getType() != Xml.TEXT) {
    11. continue;
    12. }
    13....
    14. System.err.println(name + ": " + text);

      上面的這段代碼在"parseAddressTag"中循環,直到找到與<address>對應的終止標記。如果它遇到其它任何標記,那么標記名和標記內容就會被打印到控制臺上。因此,如果找到標記<name>Robert Cadena</name>,你將看到下面的控制臺輸出:

    name: Robert Cadena

      一旦找到<address>的終止標記(8- 10行),控件被返回調用函數,然后又開始查找<address>。
    如你所見,使用Pull語法分析程序非常容易,并且能夠傳送語法分析程序到另一個函數,然后在文檔中查找元素。你并不局限于分析資源文件;你還可以使用HttpConnection把這個函數傳遞到http InputStream。這把你從讀取InputStream、保存內容、分析內容等操作中解放了出來,一切都由KXML為你完成。

      DOM處理

      Pull語法分析特別適用于當你需要維護非常小的存儲空間的時候,因為發出事件的文檔只有一部分存在于內存中。換句話說,如果你感興趣的特定數據段是文檔中部的幾百個字節,那么前面的幾百個字節就不必保存在內存中了。

      但是如果你能夠節省一些內存,你可以使用另一個版本的KXML語法分析程序,它包含對DOM的支持。 DOM是保存在內存中的整個文檔樹,每個標記都被分離成節點(Node)對象。 你可以遍歷這個文檔樹,然后根據需要取得數據。

      工程中的另一個MIDlet,KXMLDemo_dom,做了同樣的事情。它讀取一個通訊錄,然后把內容打印到控制臺,但是這次它使用了DOM。下面給出源代碼中比較重要的幾行.

    1.Document doc = new Document();
    2....
    3.parser = new XmlParser( isr );
    4.doc.parse( parser );

      第一行創建了一個文檔,保存XML樹。第三行從一個名為isr的InputStreamReader中創建一個KXML語法分析程序。第四行傳送這個語法分析程序到文檔,然后讓文檔開始分析。XML被遞歸分析,直到到達文檔的結尾。當分析調用退出時,整個文檔被裝入內存,這時你就可以操作它了。

    1.Element root = doc.getRootElement();
    2.int child_count = root.getChildCount();
    3....
    4.for (int i = 0; i < child_count ; i++ ) {
    5....
    6. Element kid = root.getElement(i);
    7.
    8. if (!kid.getName().equals("address")) {
    9. continue;
    10. }

      因為我們知道<address>元素是根元素的直接子元素,我們可以遍歷根元素的子元素,尋找address標記,如果子元素不是一個address 標記,則返回。

    1.int address_item_count = kid.getChildCount();
    2.
    3. for (int j = 0; j < address_item_count ; j++) {
    4....

      如果我們找到了address子元素,我們開始遍歷它的子元素,并把這些子元素的內容打印出來。不幸的是,你不能只是使用kid.getElement("name"),因為如果這個元素不存在的話,那么你將得到一個RuntimeException。所以我建議只有當你知道XML文檔中存在你所有需要的所有字段時才使用這個方法。
    主站蜘蛛池模板: 青柠影视在线观看免费高清| 最近中文字幕无吗免费高清 | 亚洲中文无码卡通动漫野外| 亚洲中文字幕无码一区| 精品国产免费一区二区| 在线观看免费中文视频| jizz免费观看| 337P日本欧洲亚洲大胆精品| 亚洲天堂中文字幕在线观看| 亚洲av午夜福利精品一区| mm1313亚洲精品无码又大又粗| 中文字幕影片免费在线观看| 香蕉免费一区二区三区| 你好老叔电影观看免费| 国产黄色免费观看| 日韩色视频一区二区三区亚洲| 亚洲中文字幕无码一去台湾| 亚洲精品在线播放视频| 亚洲不卡中文字幕无码| 亚洲中文字幕无码久久2017| 亚洲第一区精品日韩在线播放| 永久中文字幕免费视频网站| 成年性生交大片免费看| 国产国产人免费视频成69堂| 国产成人精品免费视| a级毛片毛片免费观看久潮喷| 一区二区三区视频免费观看| 亚洲丰满熟女一区二区哦| 亚洲中文字幕乱码一区| 日韩亚洲不卡在线视频中文字幕在线观看| 久久综合亚洲色一区二区三区| 亚洲国产精品热久久| 亚洲AV成人精品网站在线播放| 国产成人精品日本亚洲| 亚洲AV无码成人专区片在线观看| 亚洲人成网77777亚洲色| 亚洲精品成人无码中文毛片不卡| 亚洲色大成网站WWW久久九九| 亚洲色精品88色婷婷七月丁香| 国产亚洲综合色就色| 亚洲国产天堂在线观看|