KXML2部分详解(J2ME)

下那些给到处给别人写序的 ~···
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&lt;/link>
  •           <description>< ![CDATA[描述1]]> </description>
  •           <pubdate>Thu May 07 10:49:37 CST 2009</pubdate>
  •           <guid isPermaLink="true">http://www.sunjianyes.cn/1&lt;/guid>
  •        </item>
  •       <item>
  •           <title>< ![CDATA[标题2]]> </title>
  •           <link>http://www.allove.org/2&lt;/link>
  •           <description>< ![CDATA[描述2]]> </description>
  •           <pubdate>Thu May 07 10:49:37 CST 2009</pubdate>
  •           <guid isPermaLink="true">http://www.allove.org/2&lt;/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 了。好了,今天就到此为止吧,本来这是昨天的文章,但是昨天突然断网了,延迟到今天,呵呵。
下面还有:

  • 2009年05月10日 -- 使用NetBeans开发J2ME
  • 2009年04月27日 -- J2ME中文乱码

               
                                                                                                                                                                                                                                                                                                                                                                                版权说明: 下面是本文信息,转载请务必注明出处!
分类目录: J2ME开发
发表日期: 公元2009年五月8日
核心提示: J2ME开发,Kxml2,XML解析
本文链接: http://www.sunjianyes.cn/Article/kxml-2-on-j2me.html

你可能感兴趣的:(KXML2部分详解(J2ME))