1.  WAP Binary XML定义好XML片断表述出同步server地址、远程数据库名称、登录账号等等内容一、两种訪问方法:
  2.   
  3.   眼下的kxml支持两种wap格式:WBXML/WML
  4.   
  5.   而有两种方法将解析WBXML
  6.   
  7.   1。使用j2meWBXML转换到XML
  8.   
  9.   2。使用kxml直接解析WBXML流。以下我在这里讨论一下使用另外一种方法实现client代码解析WBXML,当然要使用kxml了。
  10.   
  11.   二、kxml实现方法:
  12.   
  13.   首先须要位于web server的应用程序通过开放WAP网关(关于JWAP:详见http://jwap.sourceforge.net/)发送WML文件给j2me client。在WAP网关将数据发送j2me client之前WAP网关将WML文件转换为了WBXML文件。以下代码的展示了j2me client怎样接收WBXML数据,解析数据,并显示实用的数据在手机屏幕上。
  14.   
  15.   须要注意,在本例程中使用的kxml v1.0版本号,kxml v2.0版本号在使用上可能有所不同,开发人员能够參考kxml2的手冊。
  16.   
  17.   import java.io.*;
  18.   import org.kxml.*;
  19.   import org.kxml.parser.*;
  20.   import org.kxml.wap.*;
  21.   import javax.microedition.lcdui.*;
  22.   import javax.microedition.midlet.*;
  23.   import javax.microedition.io.*;
  24.   public class WbxmlTest extends MIDlet implements CommandListener
  25.   {  private Display display = null;  private List menu = null;
  26.   private Form form = null;
  27.   private String incomingText = "";
  28.   static final Command okCommand
  29.   = new Command("Ok",
  30.   Command.OK,
  31.   1);
  32.   static final Command exitCommand
  33.   = new Command("Exit",
  34.   Command.EXIT,
  35.   0);
  36.   // This is a hard coded WSP message that contains
  37.   // address of web server where our jsp page is located.
  38.   byte[] message ={
  39.   (byte)'1',(byte)0x40,(byte)0x3D,(byte)'h',(byte)'t',
  40.   (byte)'t',(byte)'p',(byte)':',(byte)'/',(byte)'/',
  41.   (byte)'l',(byte)'o',(byte)'c',(byte)'a',(byte)'l',
  42.   (byte)'h',(byte)'o',(byte)'s',(byte)'t',(byte)':',
  43.   (byte)'8',(byte)'0',(byte)'8',(byte)'0',(byte)'/',
  44.   (byte)'e',(byte)'x',(byte)'a',(byte)'m',(byte)'p',
  45.   (byte)'l',(byte)'e',(byte)'s',(byte)'/',(byte)'j',
  46.   (byte)'s',(byte)'p',(byte)'/',(byte)'f',(byte)'i',
  47.   (byte)'n',(byte)'a',(byte)'l',(byte)'f',(byte)'i',
  48.   (byte)'l',(byte)'e',(byte)'s',(byte)'/',(byte)'D',
  49.   (byte)'a',(byte)'t',(byte)'.',(byte)'j',(byte)'s',
  50.   (byte)'p',(byte)0x80,(byte)0x94,(byte)0x88,(byte)0x81,
  51.   (byte)0x6A,(byte)0x04,(byte)0x83,(byte)0x99
  52.   };
  53.   // Memory space to receive message.  byte[] msg = new byte [256];
  54.   public void pauseApp() { /* ----- */ }
  55.   public void destroyApp(boolean unconditional)
  56.   { notifyDestroyed(); }
  57.   public void startApp() {
  58.   display = Display.getDisplay(this);
  59.   this.mainMenu();
  60.   }//startApp
  61.   //Displays the menu screen
  62.   private void mainMenu() {
  63.   menu = new List(" Send Request", Choice.IMPLICIT);
  64.   menu.append(" Send Message",null);
  65.   menu.addCommand(okCommand);
  66.   menu.setCommandListener(this);
  67.   display.setCurrent(menu);
  68.   }//mainMenu
  69.   //Display the reply from WAPGateway (JWap).
  70.   private void showReply()  {
  71.   form = new Form( "Incoming Message" );
  72.   form.append("The price = " + incomingText);
  73.   
  74.   form.addCommand(exitCommand);
  75.   form.setCommandListener(this);
  76.   display.setCurrent(form);  }//showReply
  77.   // Makes a WSP Connection with a WAPGateway,
  78.   // Sends a message and receives the reply.
  79.   public void getConnect() {
  80.   Datagram dgram =null;
  81.   DatagramConnection dc=null;
  82.   try
  83.   {
  84.   dc = (DatagramConnection)Connector.open ("datagram://127.0.0.1:9200");
  85.   dgram = dc.newDatagram(message, message.length);
  86.   try{
  87.   dc.send(dgram);}
  88.   catch (InterruptedIOException e){
  89.   e.printStackTrace(); }
  90.   dgram = dc.newDatagram (msg,msg.length);
  91.   try{
  92.   dc.receive(dgram);}
  93.   catch (InterruptedIOException e){
  94.   e.printStackTrace();}
  95.   catch( IOException e){
  96.   e.printStackTrace();}
  97.   // This is the most interesting part.
  98.   incomingText = this.getIncomingTextOfWmlc(dgram.getData());
  99.   this.showReply();
  100.   dc.close();
  101.   }//try
  102.   catch (IllegalArgumentException ie){
  103.   ie.printStackTrace(); }
  104.   catch (ConnectionNotFoundException cnf){
  105.   cnf.printStackTrace();  }
  106.   catch (IOException e){e.printStackTrace();}
  107.   }//getConnect()
  108.   private String getIncomingTextOfWmlc ( byte[] wmlc ) {
  109.   try {
  110.   // Remove WSP header.
  111.   // We know it is 19 bytes for our case.
  112.   // But for real world applications,
  113.   // this should be dynamically deteced.
  114.   for ( int j = 0; j < wmlc.length-19; j++ )
  115.   wmlc[j] = wmlc[j+19];
  116.   WmlParser parser = new WmlParser(new ByteArrayInputStream(wmlc));
  117.   while (true) {
  118.   try {
  119.   ParseEvent parseEvent = parser.read();
  120.   if ( parseEvent.getType() == Xml.START_TAG ) {
  121.   Attribute attr =
  122.   parseEvent.getAttribute("value");
  123.   if ( attr != null )
  124.   return attr.getValue();
  125.   }//if
  126.   }//try
  127.   catch ( IOException e) {}
  128.   }//while
  129.   }//try
  130.   catch ( IOException e) { e.printStackTrace();  }
  131.   return "error";
  132.   }//getIncomingTextOfWmlc
  133.   public void commandAction(Command c, Displayable d) {
  134.   String commandlabel = c.getLabel();
  135.   if (commandlabel.equals("Exit"))
  136.   destroyApp(false);
  137.   else if (commandlabel.equals("Ok"))
  138.   getConnect();
  139.   }//commandAction
  140.   }//class WbxmlTest
  141.   
  142.   为了演示目的,除了建立一个web Server外,还要在本机建立一个JWAP Server
  143.   
  144.   三、代码说明:
  145.   
  146.   上面的代码将数据连接请求发送到了本机的JWAP ServerURL:“datagram://127.0.0.1:9200”,并发送了一个硬编码的WSP(wireless Session Protocol)请求:http://localhost:8080/examples/jsp/finalfiles/Dat.jsp,然后等待并读取JWAP Server的回应,在接收到回应信息后使用kxml解析提取当中的数据(元素属性名为“value”的属性值)。在解析完毕后,将数据显示于手机屏幕上。
  147.   
  148.   代码中的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头。
  149.   
  150.   之后,getIncomingTextOfWmlc方法使用KXML的事件解析机制进行了4步操作:
  151.   
  152.   1。传入保存WBXML数据的字节数组构造WmlParser 对象;
  153.   
  154.   2。调用WmlParserread方法,找到第一个TAG開始的地方;
  155.   
  156.   3。读取“value”属性值;
  157.   
  158.   4。回到第2步进行23之间的循环,直到找不到START_TAG
  159.   
  160.   四、数据流程:
  161.   
  162.   而在JWAP网关接收到j2me client发来的硬编码请求后,将这个请求转发给了web Server,本例程中的web Serverhttp://localhost:8080。web Server接收到请求后,使用一个硬编码的WML文件作为回应:
  163.   <?xml version="1.0"?>
  164.   <!DOCTYPE wml PUBLIC "-//WAPFORUM//DTD WML 1.1//EN" "http://www.wapforum.org/DTD/wml_1.1.xml">
  165.   <%@ page language="java" contentType= "text/vnd.wap.wml" %>
  166.   <wml>
  167.   <card id="c0" newcontext="false" ordered="false">
  168.   <input type="Price" value="15224" emptyok="false"/>
  169.   </card>
  170.   </wml>
  171.   
  172.   JWAP网关接收到这个web ServerWML文件后,将其转换为WBXML格式并改动其content-type编码为WBXML,最后将转换后的WBXML格式数据发给了j2me client
  173.   
  174.   五、总结:
  175.   
  176.   使用kxml方法避免了XMLWBXML之间的相互转换,WBXML文件的格式降低了XML文件的大小,不仅可将WBXML用于WAP设备,也能够用于基于web的程序与无线设备之间的通讯和数据交换。 

Android kxml解析WBXML的更多相关文章

  1. [置顶] Android学习系列-Android中解析xml(7)

    Android学习系列-Android中解析xml(7) 一,概述 1,一个是DOM,它是生成一个树,有了树以后你搜索.查找都可以做. 2,另一种是基于流的,就是解析器从头到尾解析一遍xml文件.   ...

  2. android XMl 解析神奇xstream 六: 把集合list 转化为 XML文档

    前言:对xstream不理解的请看: android XMl 解析神奇xstream 一: 解析android项目中 asset 文件夹 下的 aa.xml 文件 android XMl 解析神奇xs ...

  3. android XMl 解析神奇xstream 五: 把复杂对象转换成 xml ,并写入SD卡中的xml文件

    前言:对xstream不理解的请看: android XMl 解析神奇xstream 一: 解析android项目中 asset 文件夹 下的 aa.xml 文件 android XMl 解析神奇xs ...

  4. android XMl 解析神奇xstream 四: 将复杂的xml文件解析为对象

    前言:对xstream不理解的请看: android XMl 解析神奇xstream 一: 解析android项目中 asset 文件夹 下的 aa.xml 文件 android XMl 解析神奇xs ...

  5. android XMl 解析神奇xstream 三: 把复杂对象转换成 xml

    前言:对xstream不理解的请看: android XMl 解析神奇xstream 一: 解析android项目中 asset 文件夹 下的 aa.xml 文件 android XMl 解析神奇xs ...

  6. android XMl 解析神奇xstream 二: 把对象转换成xml

    前言:对xstream不理解的请看:android XMl 解析神奇xstream 一: 解析android项目中 asset 文件夹 下的 aa.xml 文件 1.Javabeen 代码 packa ...

  7. Android动画解析--XML

    动画类型 Android的animation由四种类型组成 XML中 alpha 渐变透明度动画效果 scale 渐变尺寸伸缩动画效果 translate 画面转换位置移动动画效果 rotate 画面 ...

  8. android 中解析XML的方法(转)

    在XML解析和使用原始XML资源中都涉及过对XML的解析,之前使用的是 DOM4J和 XmlResourceParser 来解析的.本文中将使用XmlPullParser来解析,分别解析不同复杂度的t ...

  9. 实现android上解析Json格式数据功能

    实现android上解析Json格式数据功能,该源码转载于安卓教程网的,http://android.662p.com ,个人感觉还不错的,大家可以看看一下吧. package com.practic ...

随机推荐

  1. VC图形绘制双缓存的代码复用性讨论

    在前文中已经讨论了如何实现界面绘制双缓存的问题,前文网址如下: http://www.2cto.com/kf/201111/112429.html 双缓存的主要思路是:先把图形绘制到内存DC中,然后再 ...

  2. Nginx和Tomcat负载均衡实现session共享(转)

    以前的项目使用Nginx作为反向代理实现了多个Tomcat的负载均衡,为了实现多个Tomcat之间的session共享,使用了开源的Memcached-Session-Manager框架. 此框架的优 ...

  3. js获取并设置&lt;p&gt;&lt;/p&gt;的显示的值。

    原文链接:http://www.nowamagic.net/librarys/posts/jquery/23 html()方法 此方法类似于JavaScript中的innerHTML属性,能够用来读取 ...

  4. 在SharePoint 2010中部署RBS (转)

    一.RBS(Remote BLOB Storage)简单介绍 在SharePoint的大部分企业应用案例中,SharePoint都是要承担着非常繁重的文件管理工作,这些文件类型包含了Word文档,Ex ...

  5. VS2012配置astyle格式化代码

    1.工具->扩展和更新,搜astyle插件,下载安装重启,当前是2.0版本. 2.工具->选项->AStyle Formatter->Edit,填入下面的,点击save,确定. ...

  6. GitHub上最受欢迎的Android开源项目TOP20

    以下这些开源项目都是从GitHub上筛选的,我强烈推荐android程序源代码有时间的时候自己在上面淘淘,或许能发现自己须要的开源程序. 了解开源项目有两个优点: 1.借鉴代码,一般来说.火爆的开源项 ...

  7. Android消息循环分析

    我们的经常使用的系统中,程序的工作一般是有事件驱动和消息驱动两种方式,在Android系统中,Java应用程序是靠消息驱动来工作的. 消息驱动的原理就是: 1. 有一个消息队列.能够往这个队列中投递消 ...

  8. tomcat各版本和jsp、jstl、servlet的依赖关系(转)

    Servlet / JSP / Tomcat  Version  Servlet/ JSP    Tomcat  2.5/2.1 6.0.18 2.4/2.0 5.5.27 2.3/1.2 4.1.3 ...

  9. OCP读书笔记(4) - 配置备份设置

    4.Configuring Backup Settings 查看RMAN持久化设置 [oracle@easthome ~]$ rman target / RMAN> show all; SQL& ...

  10. API - 微云

    API - 微云 1.接口说明 2.数据上传协议说明 1. 接口说明 文件上传申请,成功会返回实际上传的地址. 根据申请上传返回的地址,组织数据上传. 1.1 URL OAuth2.0协议: http ...