




已阅读5页,还剩3页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
如何使用kxml解析WAP作者:cleverpi 文章来源:Matrix 点击数: 22 更新时间:2006-10-11 10:13:20热点文章版权声明:任何获得Matrix授权的网站,转载时请务必以超链接形式标明文章原始出处和作者信息及本声明作者: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流。下面我在这里讨论一下使用第二种方法实现client代码解析WBXML,当然要使用kxml了。二、kxml实现方法:首先需要位于web server的应用程序通过开放WAP网关(关于JWAP:详见/)发送WML文件给j2me client。在WAP网关将数据发送j2me client之前WAP网关将WML文件转换为了WBXML文件。下面代码的展示了j2me client如何接收WBXML数据,解析数据,并显示有用的数据在手机屏幕上。需要注意,在本例程中使用的kxml v1.0版本,kxml v2.0版本在使用上可能有所不同,开发者可以参考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。三、代码说明:上面的代码将数据连接请求发送到了本机的JWAP Server的URL:“datagram:/:9200”,并发送了一个硬编码的WSP(wireless Session Protocol)请求:http:/localhost:8080/examples/jsp/finalfiles/Dat.jsp,然后等待并读取JWAP Server的回应,在接收到回应信息后使用kxml解析提取其中的数据(元素属性名为“value”的属性值)。在解析完成后,将数据显示于手机屏幕上。代码中的getConnect 方法建立与JWAP Server的连接,并发送请求给JWAP Server,要求访问web Server上的http:/localhost:8080/examples/jsp/finalfiles/Dat.jsp,在接收到JWAP Server发回的请求后,getConnect方法调用getIncomingTextOfWmlc方法提取接收到的WBXML数据。由于j2me client与JWAP Server之间的通讯使用了WAP协议堆栈,所以j2me client接收的数据中包含WSP头,在getIncomingTextOfWmlc方法中首先去掉了这个WSP头。之后,getIncomingTextOfWmlc方法使用KXML的事件解析机制进行了4步操作:1。传入保存WBXML数据的字节数组构造WmlParser 对象;2。调用WmlParser的read方法,找到第一个TAG开始的地方;3。读取“value”属性值;4。回到第2步进行2、3之间的循环,直到找不到START_TAG。四、数据流程:而在JWAP网关接收到j2me client发来的硬编码请求后,将这个请求转发给了web Server,本例程中的web Server为http:/localhost:8080。w
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 企业管理-非宅腾退工作流程 SOP
- 2025年小学六年级科学试卷及答案
- 2025年德语写作题库及答案
- 2025年山东省威海市事业单位工勤技能考试题库(含答案)
- 山区道路施工方案
- CN120110800B 一种基于分布式零知识证明的匿名数据合规性检查方法 (暨南大学)
- CN120107759B 一种视觉识别算法容器动态调度方法、系统、设备和介质 (千巡科技(深圳)有限公司)
- CN120103506A 基于三维激光扫描的半煤岩巷道围岩松动圈动态探测装置 (内蒙古黄陶勒盖煤炭有限责任公司)
- CN114091062B 职业数据处理方法及装置(支付宝(杭州)信息技术有限公司)
- 河北省沧州市任丘市任丘市麻家坞学区2024-2025学年三年级上册期中考试科学试卷(含答案)
- 2020年全国硕士研究生招生考试《管理类联考综合能力》真题及解析
- 社区医疗危急值报告制度及流程
- T-ZZB 1777-2023 全浸没式高电压电极热水锅炉
- (完整)《水浒传》课件
- 化纤厂流程图讲解
- 桥梁监测方案
- 2025年一年级上学期班主任工作计划(3篇)
- 2025年江西晶昊盐化有限公司招聘笔试参考题库含答案解析
- 协会借款管理制度内容
- 心理咨询经典案例分析
- 2025年浙能集团招聘笔试参考题库含答案解析
评论
0/150
提交评论