WAP之家:为您提供最全最新的WAP技术,CP.SP.3G等行业资讯。 WAP之家交流论坛全新开放 点击进入>>
WAP资讯 | 3G动态 | SP动态 | 运营商动态 | 内容商动态 | 制造商动态 | 论坛讨论>> 每次自动访问
WAP技术 | WAP源码 | 手机编程 | 手机源码 | 无线技术 | J2ME技术 | 手机软件 添加到收藏夹
IVR技术 | SP资料 | SMS MMS技术 | 商业方案 | IVR下载 | 书籍教程 | 工具软件 语言:繁體中文

WAP之家技术文章J2ME技术进阶教程在以CLDC為基礎的架構上分析XML

在以CLDC為基礎的架構上分析XML
作者:不详  来源:本站整理  发布时间:2005-11-29 12:10:16
越來越多的應用程式使用XML交換訊息。譬如,以 CLDC 為基礎的應用程式 需要去處理 XML 文件,甚至連 HTML 網頁也將會很有可能轉換成為一個以 XML 為基礎的格式。而這意味著從一個網頁伺服器連結一張網頁而取出資料將會需要分析 XML 的技術。

XML就是「可擴展標記語言」,是一種輕便的、以文字為基礎的方法去呈現結構化的資料。

越來越多的應用程式使用 XML 交換訊息,甚且,在一些情況下,您以 CLDC 為基礎的應用程式 (這些是指在以 CLDC 為基礎的架構上執行的,像是微小的手機裝置之類的) 需要去處理 XML 文件。之後,甚至連 HTML 網頁也將會很有可能轉換成為一個以 XML 為基礎的格式,稱為 XHTML。這意味著從一個網頁伺服器連結一張網頁而取出資料將會需要分析 XML 的技術。

尋找一個以 JAVA 為基礎的 XML 分析器不難,尤其是自從有好幾個以 XML 為基礎的的提倡開始被定義為 Java 處理程序的一部分。然而,大部分的 XML 分析器並不支援在 CLDC 所提供的有限資源環境下運作。這些分析器不是使用了太多的記憶體就是使用在 CLDC 下不能運作的 J2SETM 類別。

然而,在這有兩個能在 CLDC 環境下運作的開放原始碼 XML 分析器 ── kXML 和 NanoXML。他們二者的長處有些不同 ── 本文將會討論他們兩者,並且提供您如何去決定哪一個是最適合您的程式需求。然而,您也應該考慮是否選擇 XML,因為 XML 文件是非常冗長的。

如果您能夠控制伺服器端,去使用您自己的二進位的格式去交換資料才是有意義的。

如果一個以 Java 為基礎的客戶端與一個以 Java 為基礎的伺服器端相互溝通,這是相當容易的。在這個實例裡,使用 DataInputStream 和 DataOutputStream 類別,以輕便的方法讀寫取資料。

基本的 XML 分析器型態
基本的 XML 分析器型態有兩種:確認性的和非確認性的。

一個確認性的分析器透過一個文件型別定義或概要 (schema) 確認一份 XML 文件,以確保這份文件的內容是程式所預期的。這個要求將會減低處理的速度。一個非確認性的分析器跳過這個步驟,只保證這個 XML 文件是合乎基本格式的 (well-formed),換而言之,它遵守一般 XML 文件必須遵守的規則。kXML 和 NanoXML 二者都是非確認性的分析器。

 非確認性的分析器
XML 分析器也能以他們如何處理和呈現 XML 文件來區分。

NanoXML 是一個單一步驟 (single-step) 分析器。給定一份文件,NanoXML 以一個單一的運作分析它,並將這份文件以一個樹狀的結構傳回。kXML,相較之下,是一個多步驟的 (multi-step) 的分析器 ── 一次分析文件的一塊區域。

這兩種方法各有利弊,如果您正在處理一份龐大的文件,單一步驟的方法使用較多的記憶體,因為全部的文件都儲存在記憶體中。但是單一步驟的方法將較有效率,如果您需要穿越這份文件很多次。多步驟的方法能夠較輕易的處理龐大的文件,但是您必須做較多的簿記 (bookkeeping) 去追蹤您在文件的哪一個地方。

■ 該如何使用 kXML 呢?

從 http://www.kxml.org/ 下載 kXML 原始碼,並且將 kXML 類別包含進您的應用程式。並不是所有的類別都是需要的,所以只要下載包含最小 kXML 的 ZIP 檔。在安裝完這個檔案後,新增下面的引入陳述到您的程式中。


import org.kxml.*;
import org.kxml.parser.*;




當您準備好去分析一份文件時,產生一個 XmlParser 類別實體,傳入一個字元 (character) 流當唯一的參數。



try {
Reader r = .....;
XmlParser parser = new XmlParser( r );
}
catch( java.io.IOException e ){
// handle exception....
}




如果您的文件是以字串被儲存,舉例來說,您可以藉著轉換字串成為一個位元組 (byte) 陣列來讀取它,然後,結合 InputStreamReader 和 ByteArrayInputStream:




// 讀取字串 (exception handling omitted)
String xml = "some xml";
ByteArrayInputStream bin =
new ByteArrayInputStream( xml.getBytes() );
XmlParser parser = new XmlParser( new InputStreamReader( bin ) );




然而,更可能發生的情節是,從網路接收一份文件,舉例來說,在 CLDC 的通常連結架構 (GCF),您使用 MIDP 內建支援 HTTP 的類別來做這件事,然後您會使用 GCF 回傳的輸入流 (input stream),並且轉換它成為字元流 (character stream):




// Read from web (exception handling omitted)
HttpConnection conn = .....;
InputStreamReader doc =
new InputStreamReader( conn.openInputStream() );
XmlParser parser = new XmlParser( doc );





析器被產生後,您呼叫它的 read 方法去讀取文件分開的區塊。read 方法對文件的每一個元件回傳一個 ParseEvent 物件:




try {
boolean keepParsing = true;
while( keepParsing ){
ParseEvent event = parser.read();
switch( event.getType() ){
case Xml.START_TAG:
..... // handle start of an XML tag
break;
case Xml.END_TAG:
..... // handle end of an XML tag
break;
case Xml.TEXT:
..... // handle text within a tag
break;
case Xml.WHITESPACE:
..... // handle whitespace
break;
case Xml.COMMENT:
..... // handle comment
break;
case Xml.PROCESSING_INSTRUCTION:
..... // handle XML PI
break;
case Xml.DOCTYPE:
..... // handle XML doctype
break;
case Xml.END_DOCUMENT:
..... // end of document;
keepParsing = false;
break;
}
}
}
catch( java.io.IOException e ){
}






ParseEvent 類別為回傳的元件資訊定義了許多方法。getType 方法,舉例來說,回傳元件的型別,像是它是否是一個標籤 (tag) 的開頭、一個註解等。其他的方法提供了額外的訊息,像是一個標籤的內文或一個標籤的屬性。當 END_DOCUMENT 事件被觸發時,分析器便停止運作。

kXML 使得對一個文件遞迴下降的分析方式變的相當容易,分析器的狀態是被呼叫方法維持,遞迴的反映到一個新的分析事件。在簡單的情況下,您可以利用這個方法來保持追蹤您最後一個看過的標籤。

使用 NanoXML,必須下載一些原始碼。官方的 NanoXML 網站是 http://nanoxml.sourceforge.net/。

一個修改過

[1] [2]  下一页

[] [返回上一页] [打 印]
文章评论

用户名: 查看更多评论

分 值:100分 85分 70分 55分 40分 25分 10分 0分

内 容:

         (注“”为必填内容。) 验证码: 验证码,看不清楚?请点击刷新验证码