如何使用kxml解析WAP.doc_第1頁
如何使用kxml解析WAP.doc_第2頁
如何使用kxml解析WAP.doc_第3頁
如何使用kxml解析WAP.doc_第4頁
如何使用kxml解析WAP.doc_第5頁
已閱讀5頁,還剩3頁未讀 繼續(xù)免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

如何使用kxml解析WAP作者:cleverpi 文章來源:Matrix 點擊數(shù): 22 更新時間:2006-10-11 10:13:20熱點文章版權聲明:任何獲得Matrix授權的網(wǎng)站,轉載時請務必以超鏈接形式標明文章原始出處和作者信息及本聲明作者:cleverpig(/blog/cleverpig)原文:/resource/article/43/43909_Kxml_Wap.html關鍵字:j2me,wap,kxml一、兩種訪問方法:目前的kxml支持兩種wap格式:WBXML/WML。而有兩種方法將解析WBXML:1。使用j2me將WBXML轉換到XML;2。使用kxml直接解析WBXML流。下面我在這里討論一下使用第二種方法實現(xiàn)client代碼解析WBXML,當然要使用kxml了。二、kxml實現(xiàn)方法:首先需要位于web server的應用程序通過開放WAP網(wǎng)關(關于JWAP:詳見/)發(fā)送WML文件給j2me client。在WAP網(wǎng)關將數(shù)據(jù)發(fā)送j2me client之前WAP網(wǎng)關將WML文件轉換為了WBXML文件。下面代碼的展示了j2me client如何接收WBXML數(shù)據(jù),解析數(shù)據(jù),并顯示有用的數(shù)據(jù)在手機屏幕上。需要注意,在本例程中使用的kxml v1.0版本,kxml v2.0版本在使用上可能有所不同,開發(fā)者可以參考kxml2的手冊。import java.io.*; import org.kxml.*; import org.kxml.parser.*; import org.kxml.wap.*; import javax.microedition.lcdui.*; import javax.microedition.midlet.*; import javax.microedition.io.*; public class WbxmlTest extends MIDlet implements CommandListener private Display display = null; private List menu = null; private Form form = null; private String incomingText = ; static final Command okCommand = new Command(Ok, Command.OK, 1); static final Command exitCommand = new Command(Exit, Command.EXIT, 0); / This is a hard coded WSP message that contains / address of web server whereour jsp page is located. byte message =(byte)1,(byte)0x40,(byte)0x3D,(byte)h,(byte)t,(byte)t,(byte)p,(byte):,(byte)/,(byte)/,(byte)l,(byte)o,(byte)c,(byte)a,(byte)l,(byte)h,(byte)o,(byte)s,(byte)t,(byte):,(byte)8,(byte)0,(byte)8,(byte)0,(byte)/,(byte)e,(byte)x,(byte)a,(byte)m,(byte)p,(byte)l,(byte)e,(byte)s,(byte)/,(byte)j,(byte)s,(byte)p,(byte)/,(byte)f,(byte)i,(byte)n,(byte)a,(byte)l,(byte)f,(byte)i,(byte)l,(byte)e,(byte)s,(byte)/,(byte)D,(byte)a,(byte)t,(byte).,(byte)j,(byte)s,(byte)p,(byte)0x80,(byte)0x94,(byte)0x88,(byte)0x81,(byte)0x6A,(byte)0x04,(byte)0x83,(byte)0x99 ; / Memory space to receive message. byte msg = new byte 256; public void pauseApp() /* - */ public void destroyApp(boolean unconditional) notifyDestroyed(); public void startApp() display = Display.getDisplay(this);this.mainMenu(); /startApp /Displays the menu screen private void mainMenu() menu = new List( Send Request, Choice.IMPLICIT);menu.append( Send Message,null);menu.addCommand(okCommand);menu.setCommandListener(this);display.setCurrent(menu); /mainMenu /Display the reply from WAPGateway (JWap). private void showReply() form = new Form( Incoming Message );form.append(The price = + incomingText);form.addCommand(exitCommand);form.setCommandListener(this);display.setCurrent(form); /showReply / Makes a WSP Connection with a WAPGateway, / Sends a message and receives the reply. public void getConnect() Datagram dgram =null;DatagramConnection dc=null;try dc = (DatagramConnection)Connector.open (datagram:/:9200); dgram = dc.newDatagram(message, message.length); trydc.send(dgram); catch (InterruptedIOException e) e.printStackTrace(); dgram = dc.newDatagram (msg,msg.length); trydc.receive(dgram); catch (InterruptedIOException e) e.printStackTrace(); catch( IOException e)e.printStackTrace(); / This is the most interesting part. incomingText = this.getIncomingTextOfWmlc(dgram.getData(); this.showReply(); dc.close(); /trycatch (IllegalArgumentException ie) ie.printStackTrace(); catch (ConnectionNotFoundException cnf) cnf.printStackTrace(); catch (IOException e)e.printStackTrace();/getConnect() private String getIncomingTextOfWmlc ( byte wmlc ) try / Remove WSP header./ We know it is 19 bytes for our case./ But for real world applications,/ this should be dynamically deteced. for ( int j = 0; j wmlc.length-19; j+ ) wmlcj = wmlcj+19; WmlParser parser = new WmlParser(new ByteArrayInputStream(wmlc);while (true) try ParseEvent parseEvent = parser.read(); if ( parseEvent.getType() = Xml.START_TAG ) Attribute attr = parseEvent.getAttribute(value);if ( attr != null ) return attr.getValue(); /if/trycatch ( IOException e) /while/trycatch ( IOException e) e.printStackTrace(); return error; /getIncomingTextOfWmlc public void commandAction(Command c, Displayable d) String commandlabel = c.getLabel(); if (commandlabel.equals(Exit) destroyApp(false);else if (commandlabel.equals(Ok) getConnect(); /commandAction /class WbxmlTest為了演示目的,除了建立一個web Server外,還要在本機建立一個JWAP Server。三、代碼說明:上面的代碼將數(shù)據(jù)連接請求發(fā)送到了本機的JWAP Server的URL:“datagram:/:9200”,并發(fā)送了一個硬編碼的WSP(wireless Session Protocol)請求:http:/localhost:8080/examples/jsp/finalfiles/Dat.jsp,然后等待并讀取JWAP Server的回應,在接收到回應信息后使用kxml解析提取其中的數(shù)據(jù)(元素屬性名為“value”的屬性值)。在解析完成后,將數(shù)據(jù)顯示于手機屏幕上。代碼中的getConnect 方法建立與JWAP Server的連接,并發(fā)送請求給JWAP Server,要求訪問web Server上的http:/localhost:8080/examples/jsp/finalfiles/Dat.jsp,在接收到JWAP Server發(fā)回的請求后,getConnect方法調用getIncomingTextOfWmlc方法提取接收到的WBXML數(shù)據(jù)。由于j2me client與JWAP Server之間的通訊使用了WAP協(xié)議堆棧,所以j2me client接收的數(shù)據(jù)中包含WSP頭,在getIncomingTextOfWmlc方法中首先去掉了這個WSP頭。之后,getIncomingTextOfWmlc方法使用KXML的事件解析機制進行了4步操作:1。傳入保存WBXML數(shù)據(jù)的字節(jié)數(shù)組構造WmlParser 對象;2。調用WmlParser的read方法,找到第一個TAG開始的地方;3。讀取“value”屬性值;4。回到第2步進行2、3之間的循環(huán),直到找不到START_TAG。四、數(shù)據(jù)流程:而在JWAP網(wǎng)關接收到j2me client發(fā)來的硬編碼請求后,將這個請求轉發(fā)給了web Server,本例程中的web Server為http:/localhost:8080。w

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
  • 6. 下載文件中如有侵權或不適當內容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論