下那些给到处给别人写序的 ~···
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
- 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格式,所以可以进一步发挥其作用。
—————
下载: XmlDataParser.java
- 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 了。好了,今天就到此为止吧,本来这是昨天的文章,但是昨天突然断网了,延迟到今天,呵呵。
下面还有:
版权说明: 下面是本文信息,转载请务必注明出处!
分类目录: J2ME开发
发表日期: 公元2009年五月8日
核心提示: J2ME开发,Kxml2,XML解析
本文链接: http://www.sunjianyes.cn/Article/kxml-2-on-j2me.html