WAP Binary XML定义好XML片断表述出同步server地址、远程数据库名称、登录账号等等内容一、两种訪问方法:
  
  眼下的kxml支持两种wap格式:WBXML/WML。
  
  而有两种方法将解析WBXML:
  
  1。使用j2me将WBXML转换到XML;
  
  2。使用kxml直接解析WBXML流。以下我在这里讨论一下使用另外一种方法实现client代码解析WBXML,当然要使用kxml了。
  
  二、kxml实现方法:
  
  首先须要位于web server的应用程序通过开放WAP网关(关于JWAP:详见http://jwap.sourceforge.net/)发送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 where our 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://127.0.0.1:9200");
  dgram = dc.newDatagram(message, message.length);
  try{
  dc.send(dgram);}
  catch (InterruptedIOException e){
  e.printStackTrace(); }
  dgram = dc.newDatagram (msg,msg.length);
  try{
  dc.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();
  }//try
  catch (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++ )
  wmlc[j] = wmlc[j+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
  }//try
  catch ( IOException e) {}
  }//while
  }//try
  catch ( 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://127.0.0.1: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。web Server接收到请求后,使用一个硬编码的WML文件作为回应:
  <?xml version="1.0"?>
  <!DOCTYPE wml PUBLIC "-//WAPFORUM//DTD WML 1.1//EN" "http://www.wapforum.org/DTD/wml_1.1.xml">
  <%@ page language="java" contentType= "text/vnd.wap.wml" %>
  <wml>
  <card id="c0" newcontext="false" ordered="false">
  <input type="Price" value="15224" emptyok="false"/>
  </card>
  </wml>
  
  当JWAP网关接收到这个web Server的WML文件后,将其转换为WBXML格式并改动其content-type编码为WBXML,最后将转换后的WBXML格式数据发给了j2me client。
  
  五、总结:
  
  使用kxml方法避免了XML与WBXML之间的相互转换,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. 轻量级工具网站SimpleTools

    [解释]本来这篇文章是在前天发出来的,可是当时是刚申请的域名,现在都要域名实名认证,导致我发的项目网址打不开,惹来了很多博友的吐槽,在此说声抱歉,今天一大早就把实名认证提交了,现在网站已经可以正常访问 ...

  2. MFC的消息机制

    MFC的消息循环(::GetMessage,::PeekMessage)消息泵(CWinThread::PumpMessage)和MFC的消息在窗口之间的路由是两件不同的事情 分两个步骤完成: 1 “ ...

  3. .NET Page页面事件执行顺序,以及其作用(OnPreInit()、OnInit()等)

    以按钮事件为测试标准 1. OnPreInit //检查 IsPostBack 属性来确定是不是第一次处理该页. //创建或重新创建动态控件. //动态设置主控页. //动态设置 Theme 属性. ...

  4. javascript实现图片无缝滚动(scrollLeft的使用方法介绍)

    <!DOCTYPE html > <html> <head> <meta http-equiv="Content-Type" conten ...

  5. Swift - 文本标签(UILabel)的用法

    1,标签的创建 1 2 3 4 5 6 7 8 9 10 import UIKit class ViewController: UIViewController {     override func ...

  6. Struts2获取演示示例教程

    回想Struts2的使用过程,网上搜的教程多多少少都会有点问题.又一次记录下创建过程,方便查阅. 1.下载Struts2的jar包 下载地址:http://archive.apache.org/dis ...

  7. Android开发周报:Android L默认加密用户数据

    Android开发周报:Android L默认加密用户数据 新闻 <iCloud前车之鉴,Android L默认开启加密功能>:iCloud 艳照风波再起,第二波女星照片流出,大量女星的裸 ...

  8. GNU C的使用

    基本语法 gcc [options] [filenames]  说明:  在gcc后面可以有多个编译选项,同时进行多个编译操作.很多 的gcc选项包括一个以上的字符.因此你必须为每个选项指定各 自 ...

  9. 浏览器url传参中文时得到null的解决方法

    在写一个中文参数需求的时候遇到了以下问题,经过半天的测试和各种编码,以及网上一些有用没用的资料尝试终于解决    比如下面的url地址:http://travel.widget.baike.com:8 ...

  10. 【从翻译mos文章】SGA_TARGET与SHMMAX关系

    SGA_TARGET与SHMMAX关系 参考原始: Relationship Between SGA_TARGET and SHMMAX (文件 ID 1527109.1) 申请: Oracle Da ...