XML全稱為EXtensible Markup Language,中文稱為可擴(kuò)展標(biāo)記語言,是一種計(jì)算機(jī)所能理解的信息符號(hào)語言。計(jì)算機(jī)之間可以通過此種標(biāo)記語言處理包含各種信息的文章等功能。由于XML是一種允許相關(guān)人士自由決定的標(biāo)記語言,所以稱語言的可擴(kuò)展性。XML作為一個(gè)標(biāo)準(zhǔn),而且由于XML是一種純文本格式存儲(chǔ)文件,從而使得XML本身具備了很好的跨平臺(tái)的特點(diǎn),因此被廣泛應(yīng)用于網(wǎng)絡(luò)數(shù)據(jù)交換的各個(gè)領(lǐng)域,包括網(wǎng)絡(luò)通訊、不同程序語言平臺(tái)之間的數(shù)據(jù)交流等方面。
要使用XML作為網(wǎng)絡(luò)中傳輸通訊,勢(shì)必在傳輸雙方的發(fā)送方跟接收端都具備對(duì)XML文件的解析能力才能實(shí)現(xiàn)正常的數(shù)據(jù)交換并完成通訊過程。由于在移動(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í),使得在不久我們將能無顧慮地在移動(dòng)通訊中使用XML了。
在J2ME體系中,對(duì)xml的解析有比較有名的第三方解析API,分別為KXML和NanoXML,他們都提供了對(duì)解析xml的支持。KXML在解析XML過程中會(huì)對(duì)文件內(nèi)容一層一層進(jìn)行解析,因此成為增量式解析器,比較適合大文件的解析。而NanoXML是一次性解析器,在一次時(shí)間里就把整個(gè)xml文檔解析完,因此不適合大文件的解析,會(huì)造成內(nèi)存不足的現(xiàn)象。有關(guān)這兩種解析器網(wǎng)上都有介紹過,在這里對(duì)它們的使用進(jìn)行總結(jié)。
一、創(chuàng)建實(shí)例對(duì)象
1、使用NanoXML時(shí)由于是一次性機(jī)制,因此將xml數(shù)據(jù)流一次性封裝創(chuàng)建解析實(shí)例對(duì)象kXMLElement
/**
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ù)
/**
HttpConnection conn;
String xml;
Reader r;
*/
InputStreamReader isrDoc =
new InputStreamReader(conn.openInputStream());//獲取輸入流,這里以HttpConnection為例
XmlParser parser = new XmlParser(isrDoc);//創(chuàng)建實(shí)例對(duì)象
二、KXML解析XML
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
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是非常?。?KB)的一步XML解析器;KXML是一個(gè)只占很小存儲(chǔ)空間的XML語法分析程序,對(duì)于J2ME應(yīng)用程序非常適合
要使用XML作為網(wǎng)絡(luò)中傳輸通訊,勢(shì)必在傳輸雙方的發(fā)送方跟接收端都具備對(duì)XML文件的解析能力才能實(shí)現(xiàn)正常的數(shù)據(jù)交換并完成通訊過程。由于在移動(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í),使得在不久我們將能無顧慮地在移動(dòng)通訊中使用XML了。
在J2ME體系中,對(duì)xml的解析有比較有名的第三方解析API,分別為KXML和NanoXML,他們都提供了對(duì)解析xml的支持。KXML在解析XML過程中會(huì)對(duì)文件內(nèi)容一層一層進(jìn)行解析,因此成為增量式解析器,比較適合大文件的解析。而NanoXML是一次性解析器,在一次時(shí)間里就把整個(gè)xml文檔解析完,因此不適合大文件的解析,會(huì)造成內(nèi)存不足的現(xiàn)象。有關(guān)這兩種解析器網(wǎng)上都有介紹過,在這里對(duì)它們的使用進(jìn)行總結(jié)。
一、創(chuàng)建實(shí)例對(duì)象
1、使用NanoXML時(shí)由于是一次性機(jī)制,因此將xml數(shù)據(jù)流一次性封裝創(chuàng)建解析實(shí)例對(duì)象kXMLElement
/**
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ù)
/**
HttpConnection conn;
String xml;
Reader r;
*/
InputStreamReader isrDoc =
new InputStreamReader(conn.openInputStream());//獲取輸入流,這里以HttpConnection為例
XmlParser parser = new XmlParser(isrDoc);//創(chuàng)建實(shí)例對(duì)象
二、KXML解析XML
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
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是非常?。?KB)的一步XML解析器;KXML是一個(gè)只占很小存儲(chǔ)空間的XML語法分析程序,對(duì)于J2ME應(yīng)用程序非常適合