淺談J2ME中XML被第三方API NanoXML解析
對于J2ME這類開發平臺來說,XML有其優勢。智能手機硬件和3G將移動應用放大到更加廣闊的范圍,本文將介紹的是XML在J2ME中被KXML與NanoXML解析,也是J2ME開發的一個重點。
要使用XML作為網絡中傳輸通訊,勢必在傳輸雙方的發送方跟接收端都具備對XML文件的解析能力才能實現正常的數據交換并完成通訊過程。由于在移動設備硬件中的CPU跟內存的不足,跟網絡傳輸速率的欠缺,而且解析XML需要消耗更多的資源,因此使得XML在移動設備中的使用收到了限制,在更多時候我們采用的是采用基于基本數據流的形式(如J2ME中的DataInputStream和DataOutputStream)在讀取和發送數據。然而,隨著智能手機硬件的提高跟普及以及3G網絡的落實,使得在不久我們將能無顧慮地在移動通訊中使用XML了。
在J2ME體系中,對xml的解析有比較有名的第三方解析API,分別為KXML和NanoXML,他們都提供了對解析xml的支持。KXML在解析XML過程中會對文件內容一層一層進行解析,因此成為增量式解析器,比較適合大文件的解析。而NanoXML是一次性解析器,在一次時間里就把整個xml文檔解析完,因此不適合大文件的解析,會造成內存不足的現象。有關這兩種解析器網上都有介紹過,在這里對它們的使用進行總結。
一、創建實例對象
1、使用NanoXML時由于是一次性機制,因此將xml數據流一次性封裝創建解析實例對象kXMLElement
- view plaincopy to clipboardprint?
- /**
- HttpConnection conn;
- String xml;
- Reader r;
- */
- //......獲取網絡連接對象或者其他形式數據對象
- InputStreamReader isrDoc =
- new InputStreamReader(conn.openInputStream());//獲取輸入流,這里以HttpConnection為例
- kXMLElement kXMLeroot = new kXMLElement();//創建實例對象
- try {
- kXMLeroot.parseFromReader(isrDoc);
- }
- catch( kXMLParseException kpe ){
- kpe.printStackTrace();
- }
- catch( IOException ie ){
- ie.printStackTrace();
- }
- /**
- HttpConnection conn;
- String xml;
- Reader r;
- */
- //......獲取網絡連接對象或者其他形式數據對象
- InputStreamReader isrDoc =
- new InputStreamReader(conn.openInputStream());//獲取輸入流,這里以HttpConnection為例
- kXMLElement kXMLeroot = new kXMLElement();//創建實例對象
- try {
- kXMLeroot.parseFromReader(isrDoc);
- }
- catch( kXMLParseException kpe ){
- kpe.printStackTrace();
- }
- catch( IOException ie ){
- ie.printStackTrace();
- }
2、使用kxml時首先需要得到一個XmlParser實例對象,在構造方法中傳入Reader參數
- view plaincopy to clipboardprint?
- /**
- HttpConnection conn;
- String xml;
- Reader r;
- */
- InputStreamReader isrDoc =
- new InputStreamReader(conn.openInputStream());//獲取輸入流,這里以HttpConnection為例
- XmlParser parser = new XmlParser(isrDoc);//創建實例對象
- /**
- HttpConnection conn;
- String xml;
- Reader r;
- */
- InputStreamReader isrDoc =
- new InputStreamReader(conn.openInputStream());//獲取輸入流,這里以HttpConnection為例
- XmlParser parser = new XmlParser(isrDoc);//創建實例對象
二、KXML解析XML
- view plaincopy to clipboardprint?
- boolean parsing = true;//判斷是否到達***一個document標簽
- while()
- {
- ParseEvent event = parser.read();
- swith(event.getType())
- {
- case Xml.START_TAG:
- ....//處理開始標簽tag
- break;
- case Xml.END_TAG:
- ...//處理結束標簽tag
- break;
- .......//其他標簽處理
- case Xml.END_DOCUMENT:
- ...//最末tag
- parsing = false;
- break;
- }
- }
- boolean parsing = true;//判斷是否到達***一個document標簽
- while()
- {
- ParseEvent event = parser.read();
- swith(event.getType())
- {
- case Xml.START_TAG:
- ....//處理開始標簽tag
- break;
- case Xml.END_TAG:
- ...//處理結束標簽tag
- break;
- .......//其他標簽處理
- case Xml.END_DOCUMENT:
- ...//最末tag
- parsing = false;
- break;
- }
- }
三、NanoXML解析XML
- view plaincopy to clipboardprint?
- Vector list = kXMLeroot.getChildren();//獲取子節點列表
- Vector contents = new Vector();//用于獲取節點內容
- for(int i = 0; i < list.size(); ++i){
- kXMLElement node = (kXMLElement) list.elementAt(i);
- String tag = node.getTagName();
- if(tag == null) continue;
- if(!tag.equals( "item" )) continue;
- contents.addElement(node.getContents());
- }
- String[] contentStrs = new String[contents.size()];//轉化為字符串數組
- Vector list = kXMLeroot.getChildren();//獲取子節點列表
- Vector contents = new Vector();//用于獲取節點內容
- for(int i = 0; i < list.size(); ++i){
- kXMLElement node = (kXMLElement) list.elementAt(i);
- String tag = node.getTagName();
- if(tag == null) continue;
- if(!tag.equals( "item" )) continue;
- contents.addElement(node.getContents());
- }
- String[] contentStrs = new String[contents.size()];//轉化為字符串數組
NanoXML是一個能在CLDC 環境下運行的開放源代碼,NanoXML是非常小(6KB)的一步XML解析器;KXML是一個只占很小存儲空間的XML語法分析程序,對于J2ME應用程序非常適合。
原文標題:J2ME中KXML與NanoXML解析XML總結
鏈接:http://www.cnblogs.com/psunny/archive/2009/09/25/1573839.html
【編輯推薦】