社区编辑申请
注册/登录
浅谈J2ME中XML被第三方API NanoXML解析
开发
本文将简单谈谈XML在J2ME中被KXML与NanoXML解析,希望通过本文能对大家了解XML有所帮助。

对于J2ME这类开发平台来说,XML有其优势。智能手机硬件和3G将移动应用放大到更加广阔的范围,本文将介绍的是XML在J2ME中被KXML与NanoXML解析,也是J2ME开发的一个重点。

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

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

一、创建实例对象

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

  1. view plaincopy to clipboardprint?  
  2.  /**    
  3. HttpConnection conn;    
  4. String xml;    
  5. Reader r;    
  6. */    
  7. //......获取网络连接对象或者其他形式数据对象     
  8.  InputStreamReader isrDoc =     
  9.  new InputStreamReader(conn.openInputStream());//获取输入流,这里以HttpConnection为例     
  10.  kXMLElement kXMLeroot = new kXMLElement();//创建实例对象     
  11.  try {     
  12.   kXMLeroot.parseFromReader(isrDoc);     
  13.  }     
  14.  catch( kXMLParseException kpe ){     
  15. kpe.printStackTrace();     
  16.  }     
  17.  catch( IOException ie ){     
  18. ie.printStackTrace();     
  19. }     
  20.         
  21.  /**  
  22. HttpConnection conn;  
  23. String xml;  
  24. Reader r;  
  25. */  
  26. //......获取网络连接对象或者其他形式数据对象  
  27.  InputStreamReader isrDoc =  
  28.  new InputStreamReader(conn.openInputStream());//获取输入流,这里以HttpConnection为例  
  29.  kXMLElement kXMLeroot = new kXMLElement();//创建实例对象  
  30.  try {  
  31.   kXMLeroot.parseFromReader(isrDoc);  
  32.  }  
  33.  catch( kXMLParseException kpe ){  
  34. kpe.printStackTrace();  
  35.  }  
  36.  catch( IOException ie ){  
  37. ie.printStackTrace();  

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

  1. view plaincopy to clipboardprint?  
  2.  /**    
  3. HttpConnection conn;    
  4. String xml;    
  5. Reader r;    
  6. */    
  7. InputStreamReader isrDoc =     
  8.  new InputStreamReader(conn.openInputStream());//获取输入流,这里以HttpConnection为例     
  9.  XmlParser parser = new XmlParser(isrDoc);//创建实例对象    
  10.  /**  
  11. HttpConnection conn;  
  12. String xml;  
  13. Reader r;  
  14. */ 
  15. InputStreamReader isrDoc =  
  16.  new InputStreamReader(conn.openInputStream());//获取输入流,这里以HttpConnection为例  
  17.  XmlParser parser = new XmlParser(isrDoc);//创建实例对象 

二、KXML解析XML

  1.  view plaincopy to clipboardprint?  
  2. boolean parsing = true;//判断是否到达***一个document标签     
  3. while()     
  4. {     
  5. ParseEvent event = parser.read();     
  6. swith(event.getType())     
  7. {     
  8. case Xml.START_TAG:     
  9. ....//处理开始标签tag     
  10. break;     
  11. case Xml.END_TAG:     
  12. ...//处理结束标签tag     
  13. break;     
  14. .......//其他标签处理     
  15. case Xml.END_DOCUMENT:     
  16. ...//最末tag     
  17. parsing = false;     
  18. break;     
  19. }     
  20. }    
  21. boolean parsing = true;//判断是否到达***一个document标签  
  22. while()  
  23. {  
  24. ParseEvent event = parser.read();  
  25. swith(event.getType())  
  26. {  
  27. case Xml.START_TAG:  
  28. ....//处理开始标签tag  
  29. break;  
  30. case Xml.END_TAG:  
  31. ...//处理结束标签tag  
  32. break;  
  33. .......//其他标签处理  
  34. case Xml.END_DOCUMENT:  
  35. ...//最末tag  
  36. parsing = false;  
  37. break;  
  38. }  

三、NanoXML解析XML

  1. view plaincopy to clipboardprint?  
  2.  Vector list = kXMLeroot.getChildren();//获取子节点列表     
  3.      Vector contents = new Vector();//用于获取节点内容     
  4.      for(int i = 0; i < list.size(); ++i){     
  5.    kXMLElement node = (kXMLElement) list.elementAt(i);     
  6.    String tag = node.getTagName();     
  7.    if(tag == nullcontinue;     
  8.    if(!tag.equals( "item" )) continue;     
  9.    contents.addElement(node.getContents());     
  10.    }     
  11.      String[] contentStrs = new String[contents.size()];//转化为字符串数组    
  12.  Vector list = kXMLeroot.getChildren();//获取子节点列表  
  13.      Vector contents = new Vector();//用于获取节点内容  
  14.      for(int i = 0; i < list.size(); ++i){  
  15.    kXMLElement node = (kXMLElement) list.elementAt(i);  
  16.    String tag = node.getTagName();  
  17.    if(tag == nullcontinue;  
  18.    if(!tag.equals( "item" )) continue;  
  19.    contents.addElement(node.getContents());  
  20.    }  
  21.      String[] contentStrs = new String[contents.size()];//转化为字符串数组 

NanoXML是一个能在CLDC 环境下运行的开放源代码,NanoXML是非常小(6KB)的一步XML解析器;KXML是一个只占很小存储空间的XML语法分析程序,对于J2ME应用程序非常适合。

原文标题:J2ME中KXML与NanoXML解析XML总结

链接:http://www.cnblogs.com/psunny/archive/2009/09/25/1573839.html

【编辑推荐】

  1. .NET对象的XML序列化和反序列化概念浅析
  2. Linq实现XML转换浅谈
  3. 简述C# XML解析方法的特点及应用
  4. 浅析C# XML解析实例
  5. C# Lambda Expression使用实例解析
责任编辑:彭凡 来源: 博客园
相关推荐

2010-10-09 15:07:09

J2MEWeb服务

2010-09-29 16:20:06

J2MEWeb服务API

2010-09-29 12:45:50

2010-09-29 13:50:31

2010-09-30 16:06:21

2010-09-29 09:59:22

J2ME配置

2010-10-09 14:43:46

J2MEJUnit

2009-10-19 13:59:39

J2ME编程开发平台

2010-09-29 10:41:18

J2MEJVM

2010-01-06 15:30:51

JSON和XML

同话题下的热门内容

功能测试vs.非功能测试:能否非此即彼地进行选择?Rust难懂?一文解读其“所有权”和“借用”概念JMS VS Kafka:苹果与橘子之战!Java 服务 Docker 容器化优秀实践超全!Python图形界面框架PyQt5使用指南!太强了!Python 开发桌面小工具,让代码替我们干重复的工作!Kafka在美团数据平台的实践程序员不得不知道的 API 接口常识

编辑推荐

2017年9月编程语言排行榜:Java、C与C++三巨头还能统治排行榜多久?2017年最受欢迎的5个前端框架比较2017年11月编程语言排行榜:脚本语言怎么了?2017年3月编程语言排行榜:Swift首次进入前十最近租房有点烦!技术人如何用Python找到称心如意的“小窝”?
我收藏的内容
点赞
收藏

51CTO技术栈公众号