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的特殊而且比较标准的树形结构的关系,所以在处理数据解析的时候也有一些比较固定的解析模式。下面是一个简要的例子:
- try {
- parser.setInput(new InputStreamReader(datainputstream)); //设置输入流
- parser.next();
- parser.require(KXmlParser.START_TAG, null, "root-tag");
- while (parser.nextTag() != KXmlParser.END_TAG) {
- parser.require(KXmlParser.START_TAG, null, "child-tag");
- while (parser.nextTag() != KXmlParser.END_TAG) {
- parser.require(KXmlParser.START_TAG, null, "child-child-tag");
- while (parser.nextTag() != KXmlParser.END_TAG) {
- ...... // 这里可以有很多层,大致的意思就是你一层一层的标签逐渐循环进去。
- //下面将是最里层直接对属性的处理:
- String name = parser.getName();
- String text = parser.nextText(); //注意这是是nextText()而不是getText();
- if (name.equals("... you property name..")) {
- //do sth you like Allove.org & Sunjianyes.cn...
- } else if (name.equals("... you property name..")) {
- //do sth you like Allove.org & Sunjianyes.cn...
- } else if (....) { .... } //这里可以解析所有的属性
- parser.require(KXmlParser.END_TAG, null, name);
- }
- parser.require(KXmlParser.END_TAG, null, "child-child-tag");
- }
- parser.require(KXmlParser.END_TAG, null, "child-tag");
- }
- parser.require(KXmlParser.END_TAG, null, "root-tag");
- parser.next();
- parser.require(KXmlParser.END_DOCUMENT, null, null);
- } catch (XmlPullParserException e) {
- e.printStackTrace();
- } catch (IOException e) {
- e.printStackTrace();
- }
由于写上面这段代码的时候没有查看API,所也许会有少许拼写错误或者疏忽之类的,看到时候要注意哦,哈哈。
不知道Kxml这个项目是怎么搞的,源码有,javadoc也有,所谓的例子(demo)也有,但是就是让人看不大明白。先说javadoc吧。api吧,好歹也给个类的描述啊,接口的描述啊,顺便来点简单的实例也不为过啊。但是,为什么就那么粗糙呢?然后再说下载得到的sample吧,这个倒是有点蹊跷,例子里面没有对其提供的xml的解析,然后呢放了好几个xml文件在那里。无奈啊,做到时候还得Google百度,但是几乎没有发现什么有价值的东西。好歹我还琢磨了点东西,写个例子出来招下雷劈。
【其实用Kxml这种解析利器解析一个标准的XML文很简单,几层while循环完就OK了,但是当xml文件不标准的时候怎么办?比如RSS文件的xml,下面将要用到的这个xml就是rss的基本格式。】
首先给出XML文件:
————–
- < ?xml version="1.0" encoding="GB2312"?>
- <rss version="2.0">
- <channel>
- <title>< ![CDATA[题目]]></title>
- <link>http://www.allove.org</link>
- <language>zh-cn</language>
- <item>
- <title>< ![CDATA[标题1]]> </title>
- <link>http://www.allove.org/1</link>
- <description>< ![CDATA[描述1]]> </description>
- <pubdate>Thu May 07 10:49:37 CST 2009</pubdate>
- <guid isPermaLink="true">http://www.sunjianyes.cn/1</guid>
- </item>
- <item>
- <title>< ![CDATA[标题2]]> </title>
- <link>http://www.allove.org/2</link>
- <description>< ![CDATA[描述2]]> </description>
- <pubdate>Thu May 07 10:49:37 CST 2009</pubdate>
- <guid isPermaLink="true">http://www.allove.org/2</guid>
- </item>
- </channel>
- </rss>
- ?>
—————
接下来是java代码,下面这段代码是对上面这段xml的解析,属性名之类的也是一样的。也是大致是RSS FEED的固有XML格式,所以可以进一步发挥其作用。
—————
- package org.allove.rssreader.lib;
- import java.io.DataInputStream;
- import java.io.IOException;
- import java.io.InputStreamReader;
- import javax.microedition.io.Connector;
- import javax.microedition.io.HttpConnection;
- import org.kxml2.io.KXmlParser;
- import org.xmlpull.v1.XmlPullParserException;
- public class XmlDataParser {
- private static HttpConnection httpconnection;
- private static DataInputStream dis;
- private static Job job ;
- public static void parseData() {
- new Thread(new Runnable() {
- public void run() {
- try {
- httpconnection = (HttpConnection) Connector.open("http://127.0.0.1/data.xml");
- dis = httpconnection.openDataInputStream();
- } catch (IOException e) {
- e.printStackTrace();
- }
- KXmlParser parser = new KXmlParser();
- try {
- parser.setInput(new InputStreamReader(dis));
- parser.next();
- parser.require(KXmlParser.START_TAG, null, "rss");
- while (parser.nextTag() != KXmlParser.END_TAG) {
- parser.require(KXmlParser.START_TAG, null, "channel");
- //////////////////////////
- parser.nextTag();
- parser.require(KXmlParser.START_TAG, null, "title");
- //do sth you like Allove.org & Sunjianyes.cn...
- parser.require(KXmlParser.END_TAG, null, "title");
- parser.nextTag();
- parser.require(KXmlParser.START_TAG, null, "link");
- //do sth you like Allove.org & Sunjianyes.cn...
- parser.require(KXmlParser.END_TAG, null, "link");
- parser.nextTag();
- parser.require(KXmlParser.START_TAG, null, "language");
- //do sth you like Allove.org & Sunjianyes.cn...
- parser.require(KXmlParser.END_TAG, null, "language");
- //////////////////////
- while (parser.nextTag() != KXmlParser.END_TAG) {
- parser.require(KXmlParser.START_TAG, null, "item");
- while (parser.nextTag() != KXmlParser.END_TAG) {
- String name = parser.getName();
- String text = parser.nextText();
- if (name.equals("title")) {
- //do sth you like Allove.org & Sunjianyes.cn...
- } else if (name.equals("link")) {
- //do sth you like Allove.org & Sunjianyes.cn...
- } else if (name.equals("description")) {
- //do sth you like Allove.org & Sunjianyes.cn...
- } else if (name.equals("pubDate")) {
- //do sth you like Allove.org & Sunjianyes.cn...
- } else if (name.equals("guid")) {
- //do sth you like Allove.org & Sunjianyes.cn...
- }
- parser.require(KXmlParser.END_TAG, null, name);
- }
- parser.require(KXmlParser.END_TAG, null, "item");
- }
- parser.require(KXmlParser.END_TAG, null, "channel");
- }
- parser.require(KXmlParser.END_TAG, null, "rss");
- parser.next();
- parser.require(KXmlParser.END_DOCUMENT, null, null);
- } catch (XmlPullParserException e) {
- e.printStackTrace();
- } catch (IOException e) {
- e.printStackTrace();
- }
- }
- }).start();
- }
- }
—————-
上面这段java代码是可以成功解析上面我所提供的这个xml文件的,如果其他文件有不同的地方可以稍作修改就OK 了。好了,今天就到此为止吧,本来这是昨天的文章,但是昨天突然断网了,延迟到今天,呵呵。


9条评论 ▼