kobject.org
网站上提供了一个轻量级的xmlReader程序,大家可以到http://kobjects.sourceforge.net/utils/ 获取。作为简单的xml解析器,功能上与kxml类似,但是不支持命名空间和一些传统的事件。整个jar文件大小小于5KB。
xml
在j2me上的使用,kxml是首当其冲的老大。它实现了xmlpull的api,提供了很严谨的移动设备上的xml读写功能。
xmlpull提供了为资源有限的环境(如j2me)和j2ee应用服务器使用的xml解析API,xml pull解析允许使用stream解析的方式。
xmlpull的特点:
* 简单的接口-解析器包含一个接口、一个异常、一个建立解析器的factory;
* 无实现依赖-模仿JAXP的factory类和很容易的切换不同的XmlPull V1 API实现,而无需修改代码;
* 易用性-只有唯一的next()方法用来读取下面5类事件中的一个:
START DOCUMENT-文档起始点,这时解析器还没有准备好读取文档;
START_TAG-解析器读取到了element声明的开始标签,就是xml文件中声明element用的"<";
TEXT-解析器读取到了element的内容,如element的各种属性和value;
END_TAG-解析器读取到了element声明的结束标签,就是"/>"或者"</...>";
END_DOCUMENT-解析器读取到文档的结尾,解析工作完毕。
xmlpull提供了为资源有限的环境(如j2me)和j2ee应用服务器使用的xml解析API,xml pull解析允许使用stream解析的方式。
xmlpull的特点:
* 简单的接口-解析器包含一个接口、一个异常、一个建立解析器的factory;
* 无实现依赖-模仿JAXP的factory类和很容易的切换不同的XmlPull V1 API实现,而无需修改代码;
* 易用性-只有唯一的next()方法用来读取下面5类事件中的一个:
START DOCUMENT-文档起始点,这时解析器还没有准备好读取文档;
START_TAG-解析器读取到了element声明的开始标签,就是xml文件中声明element用的"<";
TEXT-解析器读取到了element的内容,如element的各种属性和value;
END_TAG-解析器读取到了element声明的结束标签,就是"/>"或者"</...>";
END_DOCUMENT-解析器读取到文档的结尾,解析工作完毕。
*
多功能性-由于提供了xml解析器的通用接口,所以允许多个实现和在特性和属性上的扩展
* 良好的性能-由于提供了通用的接口,可以说也就为使用快速的xml解析器提供了条件,但是目前最快的解析器,本人还没遇到过。:-)
* 最小化需要-设计上与j2me兼容,从而使其能工作于小型设备和建立使用微量内存的xmlPull兼容的解析器。
* 良好的性能-由于提供了通用的接口,可以说也就为使用快速的xml解析器提供了条件,但是目前最快的解析器,本人还没遇到过。:-)
* 最小化需要-设计上与j2me兼容,从而使其能工作于小型设备和建立使用微量内存的xmlPull兼容的解析器。
关键字解析器(XmlReader
)事件(=
位置)
在XmlReader主要有以下几种事件类型:
/** Return value of getType before first call to next() */
public final static int START_DOCUMENT = 0;
/** Signal logical end of xml document */
public final static int END_DOCUMENT = 1;
/** Start tag was just read */
public final static int START_TAG = 2;
/**End tag was just read*/
public final static int END_TAG = 3;
/** Text was just read */
public final static int TEXT = 4;
其他类型具体可参阅源代码。。。。。。
首先,通过下面代码完成了与xml文档的Stream连接;
InputStream ins=this.getClass().getResourceAsStream("/properties.xml");
。。。。。
InputStreamReader reader=new InputStreamReader(ins);
xmlReader=new XmlReader(reader);
此时,不能对xml文档进行解析。这时要调用next()方法,来将xmlReader置于START_DOCUMENT状态(第一次调用时
next解析器xmlReader的状态),以后便可以对
xml文档进行解析了。
解析器是如何对xml文档进行解析的呢?
XmlReader将xml文档看成是由一系列事件所组成的,XmlReader 是通过
next()接口来触发事件,从而完成对xml文档的读取与解析的。
<start>text</start>
<start>:代表的是开始事件(START_TAG)
Text:代表的是文本事件(TEXT)
</start>:代表的是结束事件(END_TAG)
每调用一次next接口就是触发下一事件,即跳转到下一事件。
譬如,如下代码的解析过程:
<?xml version="1.0"?>
<Stations>
<station Idx="BJGZ01">T12#T14#T16</station>
<station Idx="BJGZ02">T13#T15#T17</station>
</Stations>
InputStream ins=this.getClass().getResourceAsStream("/properties.xml");
InputStreamReader reader=new InputStreamReader(ins);
xmlReader=new XmlReader(reader);
xmlReader.next();//执行完这句代码以后,解析器XmlReader所处的事件即为//START_DOCUMENT
,所对应
xml
文档中的位置为
<Stations>
,若此时调用next接口,则事件类型将变为TEXT。这是因为
<Stations>
后面的任何东西(空格、回车换行等等一切)在解析器看来均是
TEXT
。如果将
xml
文档改为如下格式
<Stations><station Idx="BJGZ01">T12#T14#T16</station><station Idx="BJGZ02">T13#T15#T17</station></Stations>
则调用next接口,则事件类型将变为START_TAG。
当解析器处于TEXT事件中时,即对应到TEXT部分时,可以调用getText()取得TEXT内容。
解析器可以调用getPositionDescription()得到当前所处的事件的信息。
getAttributeValue()根据参数可以得到当前事件的属性值
require()这是可以用于测试当前所属事件是否是所指定的事件类型。
比如xmlReader.require(XmlReader.END_TAG,"station");即为判断当前事件是否是station的结束标志,也可以这么理解:判断当前位置是否是在于
</station>
getType()用于取得当前事件的类型