|
马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有帐号?立即注册
x
唉!都是钱闹的1.Swing和.net开发比较------从市场份额看.net开发主要占据大部分的中小型和中型的的桌面开发,原因是它封装了很多工具xml|语法 Enhydra的KXML是一个只占很小存储空间的XML语法剖析程序,关于J2ME使用程序十分合适。它有一个十分共同的DOM操纵办法和被称为Pull的语法剖析办法。
在开辟一个用于J2ME设备的多人游戏项目。在这个使用程序中,服务器和设备之间的通信本来被编码成由"&"分开的键值对,如许从服务器检索变量会很快,可是当我入手下手处置更庞大的数据布局和嵌套的数据布局时,我发明这类办法其实不合用。在这类情形,它会变得很难写数据而且简单堕落。
为懂得决这成绩,我决意利用XML从头编写使用程序的数据传输部分。关于我来讲,XML是一个天然而然的选择,不单单由于我已利用它在之前的一个项目中编写了经由过程收集向applet中传送信息的程序,并且由于XML的确很简单调试和编写。固然,它还让你利用一种很丰厚的格局来布局化这些数据。但是,让我意想不到的是我竟为我的编程工具箱找到一颗可贵的宝石。
KXML是一个被计划用于J2ME设备的简化类库,固然它也能够被用于别的必要小型XML语法剖析程序的情况,好比Applet。KXML是一个Enhydra保护的项目,撑持上面的功能:
撑持XML称号空间
用"松懈"形式剖析HTML或别的SGML格局
占用很少的存储空间(21kbps)
基于Pull的剖析
撑持XML写操纵
可选的DOM撑持
可选的WAP撑持
在本文中,具体申明个中的一些特性,特别是Pull剖析和DOM操纵,并且我将告知你怎样反省KXML在内存中操纵的效果。本文中的两个MIDlet例程都有完全的源代码,能够向你申明怎样利用KXML(点击下载)。在KToolBar1.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.XmlParserparser=null;
2......
3.parser=newXmlParser(newInputStreamReader(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.ParseEventnext=parser.read();
8.
9.//ifitsnotatexteventthenskipit
10.if(next.getType()!=Xml.TEXT){
11.continue;
12.}
13....
14.System.err.println(name+":"+text);
下面的这段代码在"parseAddressTag"中轮回,直到找到与<address>对应的停止标志。假如它碰到别的任何标志,那末标志名和标志内容就会被打印到把持台上。因而,假如找到标志<name>RobertCadena</name>,你将看到上面的把持台输入:
name:RobertCadena
一旦找到<address>的停止标志(8-10行),控件被前往挪用函数,然后又入手下手查找<address>。
如你所见,利用Pull语法剖析程序十分简单,而且可以传送语法剖析程序到另外一个函数,然后在文档中查找元素。你其实不范围于剖析资本文件;你还可使用HttpConnection把这个函数传送到httpInputStream。这把你从读取InputStream、保留内容、剖析内容等操纵中束缚了出来,统统都由KXML为你完成。
DOM处置
Pull语法剖析出格合用于当你必要保护十分小的存储空间的时分,由于收回事务的文档只要一部分存在于内存中。换句话说,假如你感乐趣的特定命据段是文档中部的几百个字节,那末后面的几百个字节就不用保留在内存中了。
可是假如你可以节俭一些内存,你可使用另外一个版本的KXML语法剖析程序,它包括对DOM的撑持。DOM是保留在内存中的全部文档树,每一个标志都被分别成节点(Node)对象。你能够遍历这个文档树,然后依据必要获得数据。
工程中的另外一个MIDlet,KXMLDemo_dom,做了一样的事变。它读取一个通信录,然后把内容打印到把持台,可是此次它利用了DOM。上面给出源代码中对照主要的几行.
1.Documentdoc=newDocument();
2....
3.parser=newXmlParser(isr);
4.doc.parse(parser);
第一行创立了一个文档,保留XML树。第三行从一个名为isr的InputStreamReader中创立一个KXML语法剖析程序。第四行传送这个语法剖析程序到文档,然后让文档入手下手剖析。XML被递回剖析,直到抵达文档的开头。当剖析挪用加入时,全部文档被装进内存,这时候你就能够操纵它了。
1.Elementroot=doc.getRootElement();
2.intchild_count=root.getChildCount();
3....
4.for(inti=0;i<child_count;i++){
5....
6.Elementkid=root.getElement(i);
7.
8.if(!kid.getName().equals("address")){
9.continue;
10.}
由于我们晓得<address>元素是根元素的间接子元素,我们能够遍历根元素的子元素,寻觅address标志,假如子元素不是一个address标志,则前往。
1.intaddress_item_count=kid.getChildCount();
2.
3.for(intj=0;j<address_item_count;j++){
4....
假如我们找到了address子元素,我们入手下手遍历它的子元素,并把这些子元素的内容打印出来。不幸的是,你不克不及只是利用kid.getElement("name"),由于假如这个元素不存在的话,那末你将失掉一个RuntimeException。以是我倡议只要当你晓得XML文档中存在你一切必要的一切字段时才利用这个办法。
反省你的内存
依据履历,当你不克不及确保你的使用程序的布局,而且你必要坚持内存被占用情形较低时,你应当利用Pull语法剖析程序。当你有充足内存而且大概必要经由过程增加或挪动标志的体例操纵文档时,可使用DOM。
假如你想看看这两种办法利用内存的情形,在KtoolBar中翻开工程,利用内存监督器(Edit-->Preferences:MonitoringTag)。当你运转MIDlet,你将看到内存监控窗口弹出,有图形和数字暗示内存的利用情形。运转每个使用程序,然后察看绿线上升,这暗示你的使用程序损耗的内存量。你将看到Pull使用程序比DOM使用程序利用内存少一些。固然本例中的两个MIDlet之间的区分不长短常年夜,可是假如一个MIDlet用DOM体例遍历一个更年夜的文件,那末它将损耗更多内存。
IDE是好。java中的IDE更是百花齐放,你用jbuilder能说jbuilder赶不上vs吗?用eclipse,netbeans也很舒服啊。我就不明白“稍微差一些”那一些是从哪里差来的。 |
|