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