KXML
- 博客分类:
- 技术杂绘
KXML
2010年07月05日
KXML:J2ME中的XML语法分析利器 Enhydra的KXML是一个只占很小存储空间的XML语法分析程序,对于J2ME应用程序非常适合。它有一个非常独特的DOM操作方法和被称为Pull的语法分析方法。 我最近一直在开发一个用于J2ME设备的多人游戏项目。在这个应用程序中,服务器和设备之间的通讯原来被编码成由"&"分隔的键值对,这样从服务器检索变量会很快,但是当我开始处理更复杂的数据结构和嵌套的数据结构时,我发现这种方法并不适用。在这种情况,它会变得很难写数据并且容易出错。 为了解决这问题,我决定使用XML重新编写应用程序的数据传输部分。对于我来说,XML是一个自然而然的选择,不仅仅因为我已经使用它在以前的一个项目中编写了通过网络向applet中传送信息的程序,而且因为XML确实很容易调试和编写。当然,它还让你使用一种很丰富的格式来结构化这些数据。然而,让我意想不到的是我竟为我的编程工具箱找到一颗珍贵的宝石。 KXML是一个被设计用于J2ME设备的简化类库,虽然它也可以被用于其它需要小型XML语法分析程序的环境,比如Applet。KXML是一个Enhydra维护的项目,支持下面的性能: 支持XML名称空间用"松散"模式分析HTML或其它SGML格式 占用很少的存储空间(21 kbps) 基于Pull的分析 支持XML写操作 可选的DOM支持 可选的WAP支持 在本文中,我将详细说明其中的一些特点,尤其是Pull分析和DOM操作,而且我将告诉你如何检查KXML在内存中操作的效果。 本文中的两个MIDlet例程都有完整的源代码,可以向你说明如何使用KXML(点击下载)。在KToolBar 1.04工程中不包含KXML类库--你必须从http://KXML.enhydra.org/取得类库,然后把压缩文件放在工程的"lib"目录下。 使用XML工作 有两个常见的使用XML工作的方法:操作DOM或者捕捉语法分析事件。操作DOM是一个与XML相互作用的简单方法,通常这个XML是一棵完整的XML树,被解析成一个存放在存储器中的节点结构,你可以遍历这棵树。它非常简单易用,但是因为整棵树存在于存储器中造成存储器的负担。 第二种方法在捕捉语法分析事件中,每当语法分析程序遇到数据中的特定结构,它就会遍历XML数据,然后把结果发回前面注册的一个事件监听器中。比如说,当语法分析程序遇到一个起始标记,如<html>,那么事件监听器将接收一个事件,通知它这个情况,并且向它传递任何所需的信息。实现这种策略的语法分析程序被称为push语法分析程序,因为这个语法分析程序把事件"推入"一个监听器中。 KXML支持DOM语法分析和操作,但是不支持push语法分析。取而代之,它使用一种稍微不同的称为"Pull"的分析方法。与push语法分析相反,Pull语法分析让程序员从语法分析程序中"拉"出下一个事件。在push语法分析中,你必须维护你正在分析的当前数据的状态,然后基于传送到监听器的事件,恢复任何以前的状态,并且当你转换到一个不同的状态时保存新的状态。Pull语法分析使处理状态改变更加容易,因为你可以发送分析器到不同的函数,维护它们自己的状态变量。 Pull语法分析 让我们来研究一个例子,看看KXML如何做一个Pull语法分析程序。演示程序名为KXMLDemo_Pull。它将使用一个Pull语法分析程序查看一个包含通讯录信息的文件。下面给出源代码中比较重要的几行,我还给出了注释。 1.XmlParser parser = null; 2...... 3.parser = new XmlParser( new InputStreamReader( 1this.getClass().getResourceAsStream(resfile_name) )); 第三行创建了一个XmlParser,把它传到一个InputStream中。这个语法分析程序反复调用,直到出现END_DOCUMENT事件。 1.while ( (event = parser.read()).getType() != Xml.END_DOCUMENT ) { 2. ... 3.if (name != null && name.equals("address")) { 4. ... 5. parseAddressTag( parser ); 第三行判断事件是否以一个<address>标记开始,第五行传送语法分析器到控制语法分析程序的"parseAddressTag"。 1.while ((event = parser.peek()).getType() != Xml.END_DOCUMENT) { 2.... 3. if (type == Xml.END_TAG && name.equals("address")) { 4. return; 5. } 6.... 7. ParseEvent next = parser.read(); 8. 9. // if it's not a text event then skip it 10. if (next.getType() != Xml.TEXT) { 11. continue; 12. } 13.... 14. System.err.println(name + ": " + text); 上面的这段代码在"parseAddressTag"中循环,直到找到与<address>对应的终止标记。如果它遇到其它任何标记,那么标记名和标记内容就会被打印到控制台上。因此,如果找到标记<name>Robert Cadena</name>,你将看到下面的控制台输出: name: Robert Cadena 一旦找到<address>的终止标记(8- 10行),控件被返回调用函数,然后又开始查找<address>。 如你所见,使用Pull语法分析程序非常容易,并且能够传送语法分析程序到另一个函数,然后在文档中查找元素。你并不局限于分析资源文件;你还可以使用HttpConnection把这个函数传递到http InputStream。这把你从读取InputStream、保存内容、分析内容等操作中解放了出来,一切都由KXML为你完成。 DOM处理 Pull语法分析特别适用于当你需要维护非常小的存储空间的时候,因为发出事件的文档只有一部分存在于内存中。换句话说,如果你感兴趣的特定数据段是文档中部的几百个字节,那么前面的几百个字节就不必保存在内存中了。 但是如果你能够节省一些内存,你可以使用另一个版本的KXML语法分析程序,它包含对DOM的支持。 DOM是保存在内存中的整个文档树,每个标记都被分离成节点(Node)对象。 你可以遍历这个文档树,然后根据需要取得数据。 工程中的另一个MIDlet,KXMLDemo_dom,做了同样的事情。它读取一个通讯录,然后把内容打印到控制台,但是这次它使用了DOM。下面给出源代码中比较重要的几行. 1.Document doc = new Document(); 2.... 3.parser = new XmlParser( isr ); 4.doc.parse( parser ); 第一行创建了一个文档,保存XML树。第三行从一个名为isr的InputStreamReader中创建一个KXML语法分析程序。第四行传送这个语法分析程序到文档,然后让文档开始分析。XML被递归分析,直到到达文档的结尾。当分析调用退出时,整个文档被装入内存,这时你就可以操作它了。 1.Element root = doc.getRootElement(); 2.int child_count = root.getChildCount(); 3.... 4.for (int i = 0; i < child_count ; i++ ) { 5.... 6. Element kid = root.getElement(i); 7. 8. if (!kid.getName().equals("address")) { 9. continue; 10. } 因为我们知道<address>元素是根元素的直接子元素,我们可以遍历根元素的子元素,寻找address标记,如果子元素不是一个address 标记,则返回。 1.int address_item_count = kid.getChildCount(); 2. 3. for (int j = 0; j < address_item_count ; j++) { 4.... 如果我们找到了address子元素,我们开始遍历它的子元素,并把这些子元素的内容打印出来。不幸的是,你不能只是使用kid.getElement("name"),因为如果这个元素不存在的话,那么你将得到一个RuntimeException。所以我建议只有当你知道XML文档中存在你所有需要的所有字段时才使用这个方法。 检查你的内存 根据经验,当你不能确保你的应用程序的结构,并且你需要保持内存被占用情况较低时,你应该使用Pull语法分析程序。当你有足够内存并且可能需要通过添加或移动标记的方式操作文档时,可以使用DOM。 如果你想看看这两种方法使用内存的情况,在KtoolBar中打开工程,使用内存监视器(Edit-->Preferences:Monitoring Tag)。 当你运行MIDlet,你将看到内存监控窗口弹出,有图形和数字表示内存的使用情况。 运行每一个应用程序,然后观察绿线上升,这表示你的应用程序消耗的内存量。 你将看到Pull应用程序比DOM应用程序使用内存少一些。虽然本例中的两个MIDlet之间的区别不是非常大,但是如果一个MIDlet用DOM方式遍历一个更大的文件,那么它将消耗更多内存。
发表评论
-
系统优化法则
2012-01-20 08:35 538系统优化法则 2010年11月13日 系统优化法则 ... -
【详解】如何编写Linux下Nand Flash驱动 1/2
2012-01-20 08:35 797【详解】如何编写Linux ... -
网络编程常见问题总结
2012-01-20 08:35 568网络编程常见问题总结 2010年10月26日 网络编程常 ... -
Frame Buffer
2012-01-20 08:35 597Frame Buffer 2010年11月18日 ... -
Windows系统的Regsvr32
2012-01-19 13:41 736Windows系统的Regsvr32 2011 ... -
as3面试题
2012-01-19 13:41 572as3面试题 2011年09月13日 ... -
电脑高手应用技巧荟萃(电脑知识二十六)
2012-01-19 13:41 405电脑高手应用技巧荟萃(电脑知识二十六) 2010年12月07 ... -
各种文件后缀名与打开方式大全a-d
2012-01-19 13:41 808各种文件后缀名与打开方式大全a-d 2012年01月11日 ... -
安全bios手册(2)
2012-01-17 03:31 662安全bios手册(2) 2010年06月20日 BIOS ... -
最全的硬盘修复专题帖(转贴)
2012-01-17 03:31 652最全的硬盘修复专题帖( ... -
行云流水
2012-01-17 03:31 573行云流水 2010年06月03日 行至水穷处,坐看云起 ... -
电脑BIOS的设置
2012-01-17 03:30 733电脑BIOS的设置 2010年08月14日 关于BIOS ... -
硬盘数据恢复原理和方法
2012-01-17 03:30 658硬盘数据恢复原理和方法 2011年03月02日 硬盘数我 ... -
中国古代的衣食住行
2012-01-16 02:06 682中国古代的衣食住行 2010年04月06日 对中国古 ... -
中国古代衣食住行 3
2012-01-16 02:06 396中国古代衣食住行 3 2009年09月27日 体衣:制衣 ... -
恳谈会
2012-01-16 02:06 426恳谈会 2010年12月28日 ... -
由“认知窄化”引起的思考
2012-01-16 02:06 823由“认知窄化”引起的 ...
相关推荐
手机解析kxml2 解析时,碰到<script>.... 想提取中间的内容,是不可能的,必须在kxml2上进行二次开发,最近做了一个浏览器项目,需要提前标签中的内容,所以把这部分与大家共同分享下。上面有对kxml2中方法的部分...
此包是 kxml包的源码文件。将包解压后 将其org文件夹拷贝到项目的src文件夹即可引用。
kxml2-2.4.2是用于解析xml文件的。 kXML 2 实现了 XmlPull API。要了解关于 XmlPull 解析器及接口说明的信息,请访问xmlpull.org。 kXML 2 基于 BSD 许可协议。
chm格式的kxml doc,用quickchm做的,不过索引没做,因为kxml的类少。
能够让你快速上手KXML2,要知道j2me平台上的xml解析跟j2ee上的解析是不一样的,小生不才,研究一个下午终于搞定,你不看是你的损失。
java_pull解析 ,包含kxml2-2.3.0.jar 和xmlpull_1_1_3_4c.jar
pull解析xml用到的包:kxml2-2.2.2.jar
个人刚学j2me时用到KXML读取XML,下载的KXML包需要重新编译打包方可用,若在eclipse中使用出现org/xmlpull/v1/XmlPullParser 类无法找到等相似异常 则使用KXML源码添加到项目中。用WTK打包不需要源码
J2ME 中 KXML2 解析器解析 xml 文件源代码所需要的压缩包 kxml2-min-2.3.0.jar。
kxml解析的时候用到, 记得导入后,也要添加到lib文件夹中
J2ME中使用KXML解释XML文件 J2ME中使用KXML解释XML文件
java_pull解析器使用包kxml2_xmlpull,包括gson-2.8.2.jar;kxml2-2.3.0.jar;xmlpull_1_1_3_4c.jar;xmlpull-1.1.3.1,jar;xstream-1.4.10.jar
xml解析+kxml2+xmlpull.......................................................
xmlpull-1.1.3.1.jar和kxml2-2.3.0.jar。支持XMLPULL解析的两个必备JAR包。作者亲测!ok
kxml2,兼容xmlpull的小型解析器.zip
java使用pull解析器解析xml文件使用资源包。绝对值得收藏的资源,走过路过别错过!...
Android 解析XML的kxml2-2.2.2.jar包 + API文档xmlpull_1_0_5_all
解析xml可能需要用到的jar包:kxml,版本:2.2.1。
j2me xml 解析 框架kxml 源码