分类:
2008-09-10 10:08:10
一、kxml的前身--xmlpull
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兼容的解析器。
二、建立在良好构架上的kxml
xmlpull api提供的通用的xml内容解析功能使用方式:使用一个循环来遍历到下一个事件,并切换到一个针对这个事件的分支语句处理。但是在使用xml解析器时,一些xml element不仅包括text还有其它的element(被称为子元素或者内嵌元素)。对于这样的xml数据,解析处理被简单化到了使用xmlpull api的nextTag和nextText方法。另外,require方法也可以使用一个解析状态的参数来表示希望取得数据的event类型。以上就是kxml使用方法。
如解析下面内容的简单xml文件:
解析代码片断如下:
parser.nextTag();parser.require(XmlPullParser.START_TAG, null, "elements");
while(parser.nextTag() == XmlPullParser.START_TAG) { parser.require(XmlPullParser.START_TAG, null, "text");
// handle element content System.out.println("text content: "+ parser.nextText());
parser.require(XmlPullParser.END_TAG, null, "text");}parser.require(XmlPullParser.END_TAG, null, "elements");
从上面的代码看出,的确很简单明了。
三、背向kxml的原因
但是如果真正的使用kxml开发j2me程序时会发现,kxml包和其依赖的xmlpull包不仅无形中增加了程序发布时的大小,而且由于没有最好的解析器带来的负面性能损耗会随着xml文件的大小成非线性增长(还好不是指数级的)。这些成为了kxml的流行障碍。
[1]