关闭顶部展开顶部

J2ME中的XML语法分析利器KXML_JSP教程

编辑Tag赚U币
教程Tag:暂无Tag,欢迎添加,赚取U币!
缂傚倸鍊搁崐鎼佸磹閹间礁纾瑰瀣捣閻棗霉閿濆牜鍤夋繛宸簼閺呮繈鏌涚仦鐐殤闁告梻鏁哥槐鎾存媴閹绘帊澹曢梻浣侯攰娴滎剟顢楅·鐛礛S闂傚倸鍊峰ù鍥х暦閻㈢ǹ绐楅柟鎵閸嬶繝鏌曟径鍫濆壔婵炴垶菤閺€浠嬫倵閿濆啫濡烽柛瀣崌瀹曟帡鎮欓弻銉ユ暪闂備礁鎼ú銊╁磻閻愮儤鍊垫い鎺嗗亾闁宠鍨块幃娆撳矗婢舵ɑ锛侀梻浣规偠閸斿酣宕伴弽褜鍤曞┑鐘崇閺呮悂鏌ㄩ悤鍌涘婵犵數濮烽弫鎼佸磻閻愬搫鍨傞悹杞拌濞兼牠鎮峰▎蹇擃伀闁绘繂鐖奸弻娑㈠焺閸愵亖妲堥梺缁樻尰閿曘垽寮婚垾鎰佸悑閹肩补鈧磭顔戦梻浣瑰▕閺€杈╂暜閿熺姴钃熼柕濞炬櫆閸嬪棝鏌涚仦鍓р槈妞ゅ骏鎷� 缂傚倸鍊搁崐鎼佸磹妞嬪海鐭嗗〒姘e亾閽樻繈姊洪鈧粔瀵哥玻濡ゅ懏鐓欓梺顓ㄧ畱婢ч箖鏌ら弶鎸庡仴闁哄本鐩俊鐑筋敊閻撳寒娼荤紓鍌欒閸嬫挸顭块懜闈涘闁绘挸鍟撮弻鏇熷緞閸繂顬夐梺缁樼箥娴滎亪寮婚敐鍛斀闁圭偓娼欓锟� 闂傚倸鍊搁崐鎼佸磹妞嬪孩顐介柨鐔哄Т绾惧鏌涢弴銊ョ€柛銉e妽缂嶅洭鏌嶉崫鍕殶妞わ富鍨辩换婵嬪閿濆棛銆愰梺鍝勭墱閸撶喎鐣峰Δ鈧オ浼村醇閻斿搫骞愰梻浣规偠閸庮垶宕濆澶嬪剭闁硅揪闄勯埛鎺戭熆鐠虹尨鍔熼弫鍫ユ⒑閸濆嫯顫﹂柛濠冪墪宀h儻绠涘☉妯溾晠鏌ㄩ弮鍌滃笡妞ゃ儲绋撶槐鎾诲磼濞嗘垵濡介梺鍝ュ仜椤兘鐛箛娑欐櫢闁跨噦鎷� 闂傚倸鍊搁崐椋庣矆娓氣偓楠炴牠顢曢敃鈧悿顕€鏌eΔ鈧悧濠囧矗韫囨稒鐓欑紓浣靛灩閺嬫稒淇婇悙鎵煓闁哄备鈧剚鍚嬮幖绮光偓鑼晼闂備礁鎲¢〃鍡欏枈瀹ュ洦宕叉繛鎴欏灩楠炪垺淇婇婵愬殭闂傚绉撮埞鎴︻敋閸℃瑧蓱闂佸憡姊归〃濠囧春閳ь剚銇勯幒鎴濇灓婵炲吋鍔欓弻鐔碱敊閼测晛鐓熼悗瑙勬礃濞茬喖寮婚崱妤婂悑闁告侗鍨抽崢顒勬⒒娴h姤纭堕柛锝忕畵楠炲繘鏁撻敓锟�,闂傚倸鍊搁崐宄懊归崶顒佸剭妞ゆ劧绠戠粈瀣亜閹扳晛鐏╃悮姗€姊绘担绛嬪殭婵﹫绠撻敐鐐村緞鐎n剛顔曟繝鐢靛Т閸嬪棝宕甸弴銏$厱妞ゆ劧绲剧粈鈧紓浣插亾闁告劏鏂傛禍婊堟煛閸屾氨浠㈤柟顔藉灦閵囧嫯绠涢弴鐐寸€剧紓浣虹帛閻╊垶鐛€n喗鍊烽柡澶嬪灩濞堛倝姊绘担鍛靛綊顢栭崱娑樼闁搞儜灞剧稁闂佸憡绻傜€氀囧几鎼淬劍鐓欐い鏍ф鐎氼喗绂嶉鍫熲拻濞达絽鎲¢崯鐐烘煟閻旀潙鍔ら柟骞垮灩铻e〒姘煎灠濞堛劍绻濋悽闈浶g痪鏉跨Ч瀵煡骞栨担鍦弳闂佺粯娲栭崐鍦偓姘炬嫹!

推荐:J2ME编程中三种低级用户界面事件处理技术
1、 覆盖keyPressed方法 在继承了Canvas的界面中,如果需要进行按键的处理,我们只需要在该类中覆盖Canvas类里面的这个方法,当手机按键被按下时,系统会自动调用该方法,并把被按

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方式遍历一个更大的文件,那么它将消耗更多内存。

  

分享:J2ME 3D编程的第一个3D程序
参考WTK2.2提供的demo,完成了第一个3D程序,虽然很简单,而且有些问题还不是很清楚,还是把代码共享出来和愿意学习J2ME 3D编程的朋友一起学习。 关于代码的编译和运行说明如下:

来源:模板无忧//所属分类:JSP教程/更新时间:2008-08-22
loading.. 评论加载中....
相关JSP教程
闂備焦鐪归崺鍕垂闁秵鍋ら柡鍥舵緛缂嶆牠鏌涢埄鍐姇闁抽攱甯楅妵鍕即濡も偓娴滄儳顪冮妶蹇曠Ф闁瑰嚖鎷�
婵犵數鍋涢顓熸叏椤撱垹纾婚柟鐐灱濡插牓鏌¢崒婵囩《濠⒀勭⊕娣囧﹪鎳犻澶嗗亾濠靛鐓熼柕蹇婃櫅閻忔煡鏌熼崙銈嗗
婵犵數濮烽。浠嬪焵椤掆偓閸熷潡鍩€椤掑嫷妫戠紒杈╁仜椤撳吋寰勭€n亝顓鹃柣搴f嚀鐎氼厽绔熼崱娆愬床濞戞柧绶氶弻锝夊閳轰胶浼堥梺鐟板殩閹凤拷
婵犵數濮烽。浠嬪焵椤掆偓閸熷潡鍩€椤掑嫷妫戠紒杈╁仜椤撳吋寰勬繝鍕靛悑闂備浇顕栭崹搴ㄥ礋椤撗勑氶梻浣筋嚙闁帮絽岣胯铻炴繛鎴欏灪閸嬪鏌ㄩ悤鍌涘
闂傚倷鑳舵灙缂佺粯鍔欓獮濠冩償閵娿儳鍔﹀銈嗗笒閸婂摜鏁崼鏇炵閻庢稒岣块惌鎺斺偓瑙勬礃缁诲牓寮幘缁樻櫢闁跨噦鎷�
闂傚倷鑳舵灙缂佺粯鍔欓獮濠冩償閵娿儳鍔﹀銈嗗坊閸嬫捇鏌涘顒夊剳缂侇喖锕弫鍌炲礈瑜忛悡鎾绘煟鎼搭垳宀涢柡鍛箞閹苯鈻庨幋鐘碉紳婵炴挻鑹鹃敃銉р偓姘炬嫹
闂傚倷娴囬妴鈧柛瀣尰閵囧嫰寮介妸褉妲堥梺浼欏瘜閸o綁寮诲☉妯锋斀闁归偊浜為懗铏圭磽娴i潧濡芥俊鐐舵椤曪綁濡搁埡濠冩櫖濠电偛妫欓崹鐢电箔閿熺姵鈷戦柛婵嗗閳ь剙顭烽獮濠囧箻閼告娼熼梺璺ㄥ櫐閹凤拷
闂傚倷绀侀幖顐﹀疮閻楀牊鍙忓瀣捣缁€濠傤熆閼搁潧濮堥柣鎿勭秮閹娼幏宀婂妳濠电偛鐪伴崐鏇㈡箒闂佹寧绻傚Λ娆戠矆閳ь剟姊洪崨濞氭垿鎮ч悩鑼殾闁规壆澧楅弲鎼佹煥閻曞倹瀚�
濠电姷顣藉Σ鍛村垂椤忓牆绀堟繝闈涙-閻斿棙淇婇姘倯閻庢氨绮妵鍕箻鐎靛摜鐣洪柣搴㈢啲閹凤拷
婵犵數濮烽。浠嬪焵椤掆偓閸熷潡鍩€椤掑嫷妫戠紒杈╁仜椤撳ジ宕堕妸銉紩婵$偑鍊栭幐鑽ゆ崲閸愵亖鍋撳铏彧濞e洤锕、娑樜旈埀顒佹櫠閸欏绡€妞ゎ偒鍠楃€氾拷
濠电姷顣藉Σ鍛村垂椤忓牆绀堟繝闈涙-閻斿棙鎱ㄥ璇蹭壕閻庤娲﹂崜鐔笺€佸▎鎾崇闁绘挸绨堕崑鎾绘偨閸涘﹦鍘搁梺鍓插亝缁诲嫬鐡┑鐘愁問閸n垶骞忛敓锟�
濠电姷顣藉Σ鍛村垂椤忓牆绀堟繝闈涙-閻斿棙鎱ㄥ璇蹭壕闂佸搫鑻幊姗€宕洪埀顒併亜閹哄棗浜鹃梺瀹狀嚙闁帮綁鐛幋锕€绠涢梻鍫熺⊕椤斿棝姊绘担鍛婃儓閻庢碍鎮傞獮蹇涙晸閿燂拷
濠电姷顣藉Σ鍛村垂椤忓牆绀堟繝闈涙-閻斿棙鎱ㄥ璇蹭壕閻庤娲╃紞渚€鐛€n亖鏀介柛顐亗缁憋拷
婵犵數濮烽。浠嬪焵椤掆偓閸熷潡鍩€椤掑嫷妫戠紒杈╁仜椤撳吋寰勬繝鍕幀闂備胶鎳撻悺銊ф崲閸曨垼鏁傞悗娑櫭肩换鍡樸亜閺嶎煈娈斿褍寮剁换婵嬶綖椤旇棄顏�
闂備浇顕ф鎼佸储濠婂牆绀堟繝闈涱儐閸嬪鏌熼幆鐗堫棄闁活厽顨呴埞鎴︽偐閹绘帗娈梺濂告涧缂嶅﹪寮婚妶澶嬪殟闁靛鍎遍~宥夋⒑缂佹ḿ澹勭紓宥勭閻e嘲鈻庨幘瀛樻闂佽法鍣﹂幏锟�
UB闂傚倷绀佸﹢杈╁垝椤栫偛绀夋俊銈呮噽瀹撲線鏌涢妷銏℃珕閻庢碍宀搁幃妤€鈽夊▍铏灴閿濈偤鏁撻敓锟�
闂傚倷娴囨竟鍫熴仈缁嬫娼栧┑鐘崇閻掗箖鎮楅悽鐢点€婇柛瀣崌閻涱噣宕归鍙ョ棯婵犵數濮崑鎾绘煥閻曞倹瀚�
闂備浇顕ф鍝ョ不瀹ュ鍨傞柛婵嗗閼板潡鏌涢姀銏犳
闂傚倷绀侀幉鈥愁潖缂佹ɑ鍙忓瀣捣缁€濠傤熆鐠鸿櫣鐏遍柛妤佺缁绘盯宕卞Δ鈧銏ゆ煕閻愬樊妲圭紒缁樼〒缁辨瑩鎮╅崫鍕腐闂備胶枪妤犲繘骞忛敓锟�
缂傚倸鍊搁崐鐑芥倿閿曞倹鍋¢柨鏇炲€搁崹鍌涚節婵犲倸顏い鈺呮敱閵囧嫰骞掑鍥舵М缂備焦褰冨﹢閬嶅焵椤掑倸浠柛濠冪箘缁辨挸顫濇0婵囨櫓闂佽法鍣﹂幏锟�
©2017 www.mb5u.com濠电姷顣藉Σ鍛村垂椤忓牆绀堟繝闈涙-閻斿棙鎱ㄥ璇蹭壕閻庢鍣崳锝夊箖閳哄懎绠甸柟鐑樻尭閻︼拷
闂傚倷娴囬妴鈧柛瀣崌閺岀喖顢涘⿰鍐炬毉濡炪們鍎婚幏锟�&闂傚倷绀侀幉锛勬暜閹烘嚦娑㈠籍閸噥妫呴梺璺ㄥ櫐閹凤拷