J2ME中KXML与NanoXML如何解析XML

原创|其它|编辑:郝浩|2009-07-27 11:32:14.000|阅读 607 次

概述:在J2ME体系中,对xml的解析有比较有名的第三方解析API,分别为KXML和NanoXML,他们都提供了对解析xml的支持。KXML在解析XML过程中会对文件内容一层一层进行解析,因此成为增量式解析器,比较适合大文件的解析。

# 界面/图表报表/文档/IDE等千款热门软控件火热销售中 >>

  XML全称为EXtensible Markup Language,中文称为可扩展标记语言,是一种计算机所能理解的信息符号语言。计算机之间可以通过此种标记语言处理包含各种信息的文章等功能。由于XML是一种允许相关人士自由决定的标记语言,所以称语言的可扩展性。XML作为一个标准,而且由于XML是一种纯文本格式存储文件,从而使得XML本身具备了很好的跨平台的特点,因此被广泛应用于网络数据交换的各个领域,包括网络通讯、不同程序语言平台之间的数据交流等方面。

  要使用XML作为网络中传输通讯,势必在传输双方的发送方跟接收端都具备对XML文件的解析能力才能实现正常的数据交换并完成通讯过程。由于在移动设备硬件中的CPU跟内存的不足,跟网络传输速率的欠缺,而且解析XML需要消耗更多的资源,因此使得XML在移动设备中的使用收到了限制,在更多时候我们采用的是采用基于基本数据流的形式(如J2ME中的DataInputStream和DataOutputStream)在读取和发送数据。然而,随着智能手机硬件的提高跟普及以及3G网络的落实,使得在不久我们将能无顾虑地在移动通讯中使用XML了。

  在J2ME体系中,对xml的解析有比较有名的第三方解析API,分别为KXML和NanoXML,他们都提供了对解析xml的支持。KXML在解析XML过程中会对文件内容一层一层进行解析,因此成为增量式解析器,比较适合大文件的解析。而NanoXML是一次性解析器,在一次时间里就把整个xml文档解析完,因此不适合大文件的解析,会造成内存不足的现象。有关这两种解析器网上都有介绍过,在这里对它们的使用进行总结。

  一、创建实例对象

  1、使用NanoXML时由于是一次性机制,因此将xml数据流一次性封装创建解析实例对象kXMLElement

/**
  HttpConnection conn;
  String xml;
  Reader r;
  */
  //......获取网络连接对象或者其他形式数据对象
  InputStreamReader isrDoc =
  new InputStreamReader(conn.openInputStream());//获取输入流,这里以HttpConnection为例
  kXMLElement kXMLeroot = new kXMLElement();//创建实例对象
  try {
  kXMLeroot.parseFromReader(isrDoc);
  }
  catch( kXMLParseException kpe ){
  kpe.printStackTrace();
  }
  catch( IOException ie ){
  ie.printStackTrace();
  }

  2、使用kxml时首先需要得到一个XmlParser实例对象,在构造方法中传入Reader参数

  /**
  HttpConnection conn;
  String xml;
  Reader r;
  */
  InputStreamReader isrDoc =
  new InputStreamReader(conn.openInputStream());//获取输入流,这里以HttpConnection为例
  XmlParser parser = new XmlParser(isrDoc);//创建实例对象

  二、KXML解析XML

 boolean parsing = true;//判断是否到达最后一个document标签
  while()
  {
  ParseEvent event = parser.read();
  swith(event.getType())
  {
  case Xml.START_TAG:
  ....//处理开始标签tag
  break;
  case Xml.END_TAG:
  ...//处理结束标签tag
  break;
  .......//其他标签处理
  case Xml.END_DOCUMENT:
  ...//最末tag
  parsing = false;
  break;
  }
  }

  三、NanoXML解析XML

 Vector list = kXMLeroot.getChildren();//获取子节点列表
  Vector contents = new Vector();//用于获取节点内容
  for(int i = 0; i < list.size(); ++i){
  kXMLElement node = (kXMLElement) list.elementAt(i);
  String tag = node.getTagName();
  if(tag == null) continue;
  if(!tag.equals( "item" )) continue;
  contents.addElement(node.getContents());
  }
  String[] contentStrs = new String[contents.size()];//转化为字符串数组

  NanoXML是一个能在CLDC 环境下运行的开放源代码,NanoXML是非常小(6KB)的一步。


标签:

本站文章除注明转载外,均为本站原创或翻译。欢迎任何形式的转载,但请务必注明出处、不得修改原文相关链接,如果存在内容上的异议请邮件反馈至chenjj@evget.com

文章转载自:IT专家网

为你推荐

  • 推荐视频
  • 推荐活动
  • 推荐产品
  • 推荐文章
  • 慧都慧问
扫码咨询


添加微信 立即咨询

电话咨询

客服热线
023-68661681

TOP