Allove Team 致力于移动应用的开发和服务(Android,J2ME,iphone,ophone)
« 开心时刻 恶搞 Android 手机帅哥鉴定器 下一篇文章 »
2009年05月17日[开发及软件]J2ME开发

1,078位读者

KXML2部分详解(J2ME)

【前言/序/Jian Sun名著】 — 恶搞一下那些给到处给别人写序的 ~···
Kxml — XML解析利器,特别是在手机这种受限设备上面,小巧实用。先说一下这个工具的大致情况,总的来说是一个基于事件模型的处理机制。其中像KXmlParser.START_TAG / KXmlParser.END_TAG 这种都会处罚一个事件,而这个事件一般可以用两种方式捕获到,,然就可以进行相关的处理了。如下:

事件捕获方式一:

if(parser.nextTag() == KXmlParser.START_TAG) {
//do sth you like Allove.org & Sunjianyes.cn
}
if(parser.nextTag() == KXmlParser.END_TAG) {
//do sth you like Allove.org & Sunjianyes.cn…
}

事件捕获方式二:

if (parser.getEventType() == XmlPullParser.START_TAG) {
//do sth you like Allove.org & Sunjianyes.cn…
}
if(parser.getEventType() == KXmlParser.END_DOCUMENT) {
//do sth you like Allove.org & Sunjianyes.cn…
}

由于XML的特殊而且比较标准的树形结构的关系,所以在处理数据解析的时候也有一些比较固定的解析模式。下面是一个简要的例子:

下载: demo.java
  1. try {
  2. parser.setInput(new InputStreamReader(datainputstream)); //设置输入流
  3. parser.next();
  4. parser.require(KXmlParser.START_TAG, null, "root-tag");
  5. while (parser.nextTag() != KXmlParser.END_TAG) {
  6. parser.require(KXmlParser.START_TAG, null, "child-tag");
  7. while (parser.nextTag() != KXmlParser.END_TAG) {
  8. parser.require(KXmlParser.START_TAG, null, "child-child-tag");
  9. while (parser.nextTag() != KXmlParser.END_TAG) {
  10. ...... // 这里可以有很多层,大致的意思就是你一层一层的标签逐渐循环进去。
  11. //下面将是最里层直接对属性的处理:
  12. String name = parser.getName();
  13. String text = parser.nextText(); //注意这是是nextText()而不是getText();
  14. if (name.equals("... you property name..")) {
  15. //do sth you like Allove.org & Sunjianyes.cn...
  16. } else if (name.equals("... you property name..")) {
  17. //do sth you like Allove.org & Sunjianyes.cn...
  18. } else if (....) { .... }  //这里可以解析所有的属性
  19. parser.require(KXmlParser.END_TAG, null, name);
  20. }
  21. parser.require(KXmlParser.END_TAG, null, "child-child-tag");
  22. }
  23. parser.require(KXmlParser.END_TAG, null, "child-tag");
  24. }
  25. parser.require(KXmlParser.END_TAG, null, "root-tag");
  26. parser.next();
  27. parser.require(KXmlParser.END_DOCUMENT, null, null);
  28. } catch (XmlPullParserException e) {
  29. e.printStackTrace();
  30. } catch (IOException e) {
  31. e.printStackTrace();
  32. }

由于写上面这段代码的时候没有查看API,所也许会有少许拼写错误或者疏忽之类的,看到时候要注意哦,哈哈。
不知道Kxml这个项目是怎么搞的,源码有,javadoc也有,所谓的例子(demo)也有,但是就是让人看不大明白。先说javadoc吧。api吧,好歹也给个类的描述啊,接口的描述啊,顺便来点简单的实例也不为过啊。但是,为什么就那么粗糙呢?然后再说下载得到的sample吧,这个倒是有点蹊跷,例子里面没有对其提供的xml的解析,然后呢放了好几个xml文件在那里。无奈啊,做到时候还得Google百度,但是几乎没有发现什么有价值的东西。好歹我还琢磨了点东西,写个例子出来招下雷劈。
【其实用Kxml这种解析利器解析一个标准的XML文很简单,几层while循环完就OK了,但是当xml文件不标准的时候怎么办?比如RSS文件的xml,下面将要用到的这个xml就是rss的基本格式。】
首先给出XML文件
————–

  1. < ?xml version="1.0" encoding="GB2312"?>
  2. <rss version="2.0">
  3. <channel>
  4. <title>< ![CDATA[题目]]></title>
  5. <link>http://www.allove.org</link>
  6. <language>zh-cn</language>
  7. <item>
  8. <title>< ![CDATA[标题1]]> </title>
  9. <link>http://www.allove.org/1</link>
  10. <description>< ![CDATA[描述1]]> </description>
  11. <pubdate>Thu May 07 10:49:37 CST 2009</pubdate>
  12. <guid isPermaLink="true">http://www.sunjianyes.cn/1</guid>
  13. </item>
  14. <item>
  15. <title>< ![CDATA[标题2]]> </title>
  16. <link>http://www.allove.org/2</link>
  17. <description>< ![CDATA[描述2]]> </description>
  18. <pubdate>Thu May 07 10:49:37 CST 2009</pubdate>
  19. <guid isPermaLink="true">http://www.allove.org/2</guid>
  20. </item>
  21. </channel>
  22. </rss>
  23. ?>

—————
接下来是java代码,下面这段代码是对上面这段xml的解析,属性名之类的也是一样的。也是大致是RSS FEED的固有XML格式,所以可以进一步发挥其作用。
—————

  1. package org.allove.rssreader.lib;
  2.  
  3. import java.io.DataInputStream;
  4. import java.io.IOException;
  5. import java.io.InputStreamReader;
  6. import javax.microedition.io.Connector;
  7. import javax.microedition.io.HttpConnection;
  8. import org.kxml2.io.KXmlParser;
  9. import org.xmlpull.v1.XmlPullParserException;
  10.  
  11. public class XmlDataParser {
  12. private static HttpConnection httpconnection;
  13. private static DataInputStream dis;
  14. private static Job job ;
  15.  
  16. public static void parseData() {
  17. new Thread(new Runnable() {
  18. public void run() {
  19. try {
  20. httpconnection = (HttpConnection) Connector.open("http://127.0.0.1/data.xml");
  21. dis = httpconnection.openDataInputStream();
  22. } catch (IOException e) {
  23. e.printStackTrace();
  24. }
  25. KXmlParser parser = new KXmlParser();
  26. try {
  27. parser.setInput(new InputStreamReader(dis));
  28. parser.next();
  29. parser.require(KXmlParser.START_TAG, null, "rss");
  30. while (parser.nextTag() != KXmlParser.END_TAG) {
  31. parser.require(KXmlParser.START_TAG, null, "channel");
  32. //////////////////////////
  33. parser.nextTag();
  34. parser.require(KXmlParser.START_TAG, null, "title");
  35. //do sth you like Allove.org & Sunjianyes.cn...
  36. parser.require(KXmlParser.END_TAG, null, "title");
  37. parser.nextTag();
  38. parser.require(KXmlParser.START_TAG, null, "link");
  39. //do sth you like Allove.org & Sunjianyes.cn...
  40. parser.require(KXmlParser.END_TAG, null, "link");
  41. parser.nextTag();
  42. parser.require(KXmlParser.START_TAG, null, "language");
  43. //do sth you like Allove.org & Sunjianyes.cn...
  44. parser.require(KXmlParser.END_TAG, null, "language");
  45. //////////////////////
  46. while (parser.nextTag() != KXmlParser.END_TAG) {
  47. parser.require(KXmlParser.START_TAG, null, "item");
  48. while (parser.nextTag() != KXmlParser.END_TAG) {
  49. String name = parser.getName();
  50. String text = parser.nextText();
  51. if (name.equals("title")) {
  52. //do sth you like Allove.org & Sunjianyes.cn...
  53. } else if (name.equals("link")) {
  54. //do sth you like Allove.org & Sunjianyes.cn...
  55. } else if (name.equals("description")) {
  56. //do sth you like Allove.org & Sunjianyes.cn...
  57. } else if (name.equals("pubDate")) {
  58. //do sth you like Allove.org & Sunjianyes.cn...
  59. } else if (name.equals("guid")) {
  60. //do sth you like Allove.org & Sunjianyes.cn...
  61. }
  62. parser.require(KXmlParser.END_TAG, null, name);
  63. }
  64. parser.require(KXmlParser.END_TAG, null, "item");
  65. }
  66. parser.require(KXmlParser.END_TAG, null, "channel");
  67. }
  68. parser.require(KXmlParser.END_TAG, null, "rss");
  69. parser.next();
  70. parser.require(KXmlParser.END_DOCUMENT, null, null);
  71.  
  72. } catch (XmlPullParserException e) {
  73. e.printStackTrace();
  74. } catch (IOException e) {
  75. e.printStackTrace();
  76. }
  77. }
  78. }).start();
  79. }
  80. }

—————-
上面这段java代码是可以成功解析上面我所提供的这个xml文件的,如果其他文件有不同的地方可以稍作修改就OK 了。好了,今天就到此为止吧,本来这是昨天的文章,但是昨天突然断网了,延迟到今天,呵呵。

读过本文的朋友还浏览过下面这些:

日志信息 »

该日志于2009-05-17 14:30由 孙建 发表在[开发及软件]J2ME开发分类下, 你可以发表评论。除了可以将这个日志以保留源地址及作者的情况下引用到你的网站或博客,还可以通过RSS 2.0订阅这个日志的所有评论。

9条评论

  1. 卢松松 说:

    不错 学习了!

    回复

    孙建 Reply:

    @卢松松, 呵呵,谢谢,欢迎常来

    回复

  2. 谷百优 说:

    学习了~~但是不太明白,哈

    回复

    孙建 Reply:

    @谷百优, 就是把XML中的信息提取出来

    回复

  3. 田翔宇 说:

    不能用 谢谢 代码出现问题 LZ给的代码有问题

    回复

  4. 秦 涛 说:

    孙 应该给的是示范性代码吧?我们在工程也是这样用的呢?调试一下 应该能用吧、

    回复

    田翔宇 Reply:

    @秦 涛,
    恩 可以解析。我们用的的一个版本的包。孙 给我了提示 确定最后是解析的索引位置不对.现在可以正常解析了.

    回复

    秦涛 Reply:

    @田翔宇, 恩的。那就好

    回复

  5. wei董 说:

    看到了高手!!!有什么联系方式么?向你们学习!!!我的邮箱是mr.dong1024@163.com

    回复

发表评论 »

返回顶部