仓酷云

 找回密码
 立即注册
搜索
热搜: 活动 交友 discuz
查看: 1661|回复: 19
打印 上一主题 下一主题

[学习教程] JAVA编程:Java中四种XML剖析手艺仓酷云

[复制链接]
精灵巫婆 该用户已被删除
跳转到指定楼层
楼主
发表于 2015-1-18 11:37:54 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
市场分额,java比asp高一点,因为C#是仿照java开发的,所以哦C#能做的java都能做到,但是java能做的,C#不一定都能做到。毕竟是抄袭吗。在平常事情中,不免会碰到把XML作为数据存储格局。面临今朝品种单一的办理计划,哪一个最合适我们呢?在这篇文章中,我对这四种支流计划做一个不完整评测,仅仅针对遍历XML这块来测试,由于遍历XML是事情中利用最多的(最少我以为)。

  预备

  测试情况:

  AMD毒龙1.4GOC1.5G、256MDDR333、Windows2000ServerSP4、SunJDK1.4.1+Eclipse2.1+Resin2.1.8,在Debug形式下测试。

  XML文件格局以下:

  <?xmlversion="1.0"encoding="GB2312"?>
  <RESULT>
  <VALUE>
  <NO>A1234</NO>
  <ADDR>四川省XX县XX镇XX路X段XX号</ADDR>
  </VALUE>
  <VALUE>
  <NO>B1234</NO>
  <ADDR>四川省XX市XX乡XX村XX组</ADDR>
  </VALUE>
  </RESULT>

  测试办法:

  接纳JSP端挪用Bean(至于为何接纳JSP来挪用,请参考:http://blog.csdn.net/rosen/archive/2004/10/15/138324.aspx),让每种计划分离剖析10K、100K、1000K、10000K的XML文件,盘算其损耗工夫(单元:毫秒)。

  JSP文件:

  <%@pagecontentType="text/html;charset=gb2312"%>
  <%@pageimport="com.test.*"%>

  <html>
  <body>
  <%
  Stringargs[]={""};
  MyXMLReader.main(args);
  %>
  </body>
  </html>

  测试

  起首进场的是DOM(JAXPCrimson剖析器)

  DOM是用与平台和言语有关的体例暗示XML文档的官方W3C尺度。DOM是以条理布局构造的节点或信息片段的汇合。这个条理布局同意开辟职员在树中寻觅特定信息。剖析该布局一般必要加载全部文档和机关条理布局,然后才干做任何事情。因为它是基于信息条理的,因此DOM被以为是基于树或基于对象的。DOM和狭义的基于树的处置具有几个长处。起首,因为树在内存中是耐久的,因而能够修正它以便使用程序能对数据和布局作出变动。它还能够在任什么时候候在树中高低导航,而不是像SAX那样是一次性的处置。DOM利用起来也要复杂很多。

  另外一方面,关于出格年夜的文档,剖析和加载全部文档大概很慢且很耗资本,因而利用其他手腕来处置如许的数据会更好。这些基于事务的模子,好比SAX。

  Bean文件:

  packagecom.test;

  importjava.io.*;
  importjava.util.*;
  importorg.w3c.dom.*;
  importjavax.xml.parsers.*;

  publicclassMyXMLReader{

  publicstaticvoidmain(Stringarge[]){
  longlasting=System.currentTimeMillis();
  try{
   Filef=newFile("data_10k.xml");
   DocumentBuilderFactoryfactory=DocumentBuilderFactory.newInstance();
   DocumentBuilderbuilder=factory.newDocumentBuilder();
   Documentdoc=builder.parse(f);
   NodeListnl=doc.getElementsByTagName("VALUE");
   for(inti=0;i<nl.getLength();i++){
    System.out.print("车商标码:"+doc.getElementsByTagName("NO").item(i).getFirstChild().getNodeValue());
    System.out.println("车主地点:"+doc.getElementsByTagName("ADDR").item(i).getFirstChild().getNodeValue());
  }
  }catch(Exceptione){
   e.printStackTrace();
  }
  System.out.println("运转工夫:"+(System.currentTimeMillis()-lasting)+"毫秒");
  }
  }


  10k损耗工夫:265203219172
  100k损耗工夫:9172901688919000
  1000k损耗工夫:691719675407708375739656
  10000k损耗工夫:OutOfMemoryError

  接着是SAX

  这类处置的长处十分相似于流媒体的长处。剖析可以当即入手下手,而不是守候一切的数据被处置。并且,因为使用程序只是在读取数据时反省数据,因而不必要将数据存储在内存中。这关于年夜型文档来讲是个伟大的长处。现实上,使用程序乃至不用剖析全部文档;它能够在某个前提失掉满意时中断剖析。一样平常来讲,SAX还比它的替换者DOM快很多。  选择DOM仍是选择SAX?

  关于必要本人编写代码来处置XML文档的开辟职员来讲,选择DOM仍是SAX剖析模子是一个十分主要的计划决议。

  DOM接纳创建树形布局的体例会见XML文档,而SAX接纳的事务模子。

  DOM剖析器把XML文档转化为一个包括其内容的树,并能够对树举行遍历。用DOM剖析模子的长处是编程简单,开辟职员只必要挪用建立的指令,然后使用navigationAPIs会见所需的树节点来完成义务。能够很简单的增加和修正树中的元素。但是因为利用DOM剖析器的时分必要处置全部XML文档,以是对功能和内存的请求对照高,特别是碰到很年夜的XML文件的时分。因为它的遍历才能,DOM剖析器经常使用于XML文档必要频仍的改动的服务中。

  SAX剖析器接纳了基于事务的模子,它在剖析XML文档的时分能够触发一系列的事务,当发明给定的tag的时分,它能够激活一个回调办法,告知该办法制订的标签已找到。SAX对内存的请求一般会对照低,由于它闪开发职员本人来决意所要处置的tag。出格是当开辟职员只必要处置文档中所包括的部分数据时,SAX这类扩大才能失掉了更好的表现。但用SAX剖析器的时分编码事情会对照坚苦,并且很难同时会见统一个文档中的多处分歧数据。

  Bean文件:

  packagecom.test;
  importorg.xml.sax.*;
  importorg.xml.sax.helpers.*;
  importjavax.xml.parsers.*;

  publicclassMyXMLReaderextendsDefaultHandler{

  java.util.Stacktags=newjava.util.Stack();

  publicMyXMLReader(){
  super();
  }

  publicstaticvoidmain(Stringargs[]){
  longlasting=System.currentTimeMillis();
  try{
   SAXParserFactorysf=SAXParserFactory.newInstance();
   SAXParsersp=sf.newSAXParser();
   MyXMLReaderreader=newMyXMLReader();
   sp.parse(newInputSource("data_10k.xml"),reader);
  }catch(Exceptione){
   e.printStackTrace();
  }
  System.out.println("运转工夫:"+(System.currentTimeMillis()-lasting)+"毫秒");
  }

  publicvoidcharacters(charch[],intstart,intlength)throwsSAXException{
  Stringtag=(String)tags.peek();
  if(tag.equals("NO")){
   System.out.print("车商标码:"+newString(ch,start,length));
  }
  if(tag.equals("ADDR")){
  System.out.println("地点:"+newString(ch,start,length));
  }
  }

  publicvoidstartElement(
  Stringuri,
  StringlocalName,
  StringqName,
  Attributesattrs){
  tags.push(qName);
  }
  }

  10k损耗工夫:1104710978
  100k损耗工夫:344406375422
  1000k损耗工夫:3234328136883312
  10000k损耗工夫:3257834313317973189030328

  然后是JDOMhttp://www.jdom.org/

  JDOM的目标是成为Java特定文档模子,它简化与XML的交互而且比利用DOM完成更快。因为是第一个Java特定模子,JDOM一向失掉鼎力推行和增进。正在思索经由过程“Java标准哀求JSR-102”将它终极用作“Java尺度扩大”。从2000岁首就已入手下手了JDOM开辟。

  JDOM与DOM次要有两方面分歧。起首,JDOM仅利用详细类而不利用接口。这在某些方面简化了API,可是也限定了天真性。第二,API大批利用了Collections类,简化了那些已熟习这些类的Java开辟者的利用。

  JDOM文档声明其目标是“利用20%(或更少)的精神办理80%(或更多)Java/XML成绩”(依据进修曲线假定为20%)。JDOM关于年夜多半Java/XML使用程序来讲固然是有效的,而且年夜多半开辟者发明API比DOM简单了解很多。JDOM还包含对程序举动的相称普遍反省以避免用户做任安在XML中偶然义的事。但是,它仍必要您充实了解XML以便做一些超越基础的事情(大概乃至了解某些情形下的毛病)。这大概是比进修DOM或JDOM接口都更成心义的事情。

  JDOM本身不包括剖析器。它一般利用SAX2剖析器来剖析和考证输出XML文档(只管它还能够将之前机关的DOM暗示作为输出)。它包括一些转换器以将JDOM暗示输入成SAX2事务流、DOM模子或XML文本文档。JDOM是在Apache允许证变体下公布的开放源码。

  Bean文件:

  packagecom.test;

  importjava.io.*;
  importjava.util.*;
  importorg.jdom.*;
  importorg.jdom.input.*;

  publicclassMyXMLReader{

  publicstaticvoidmain(Stringarge[]){
  longlasting=System.currentTimeMillis();
  try{
   SAXBuilderbuilder=newSAXBuilder();
   Documentdoc=builder.build(newFile("data_10k.xml"));
   Elementfoo=doc.getRootElement();
   ListallChildren=foo.getChildren();
   for(inti=0;i<allChildren.size();i++){
    System.out.print("车商标码:"+((Element)allChildren.get(i)).getChild("NO").getText());
    System.out.println("车主地点:"+((Element)allChildren.get(i)).getChild("ADDR").getText());
   }
  }catch(Exceptione){
   e.printStackTrace();
  }
  System.out.println("运转工夫:"+(System.currentTimeMillis()-lasting)+"毫秒");
  }
  }

  10k损耗工夫:1256218794
  100k损耗工夫:704625640766
  1000k损耗工夫:27984307502785930656
  10000k损耗工夫:OutOfMemoryError

  最初是DOM4Jhttp://dom4j.sourceforge.net/

  固然DOM4J代表了完整自力的开辟了局,但最后,它是JDOM的一种智能分支。它兼并了很多超越基础XML文档暗示的功效,包含集成的XPath撑持、XMLSchema撑持和用于年夜文档或流化文档的基于事务的处置。它还供应了构建文档暗示的选项,它经由过程DOM4JAPI和尺度DOM接口具有并行会见功效。从2000下半年入手下手,它就一向处于开辟当中。

  为撑持一切这些功效,DOM4J利用接口和笼统基础类办法。DOM4J大批利用了API中的Collections类,可是在很多情形下,它还供应一些替换办法以同意更好的功能或更间接的编码办法。间接优点是,固然DOM4J支付了更庞大的API的价值,可是它供应了比JDOM年夜很多的天真性。

  在增加天真性、XPath集成和对年夜文档处置的方针时,DOM4J的方针与JDOM是一样的:针对Java开辟者的易用性和直不雅操纵。它还努力于成为比JDOM更完全的办理计划,完成在实质上处置一切Java/XML成绩的方针。在完成该方针时,它比JDOM更少夸大避免不准确的使用程序举动。

  DOM4J是一个十分十分优异的JavaXMLAPI,具有功能优秀、功效壮大和极度易用利用的特性,同时它也是一个开放源代码的软件。现在你能够看到愈来愈多的Java软件都在利用DOM4J来读写XML,出格值得一提的是连Sun的JAXM也在用DOM4J。

  Bean文件:

  packagecom.test;

  importjava.io.*;
  importjava.util.*;
  importorg.dom4j.*;
  importorg.dom4j.io.*;

  publicclassMyXMLReader{

  publicstaticvoidmain(Stringarge[]){
  longlasting=System.currentTimeMillis();
  try{
   Filef=newFile("data_10k.xml");
   SAXReaderreader=newSAXReader();
   Documentdoc=reader.read(f);
   Elementroot=doc.getRootElement();
   Elementfoo;
   for(Iteratori=root.elementIterator("VALUE");i.hasNext();){
    foo=(Element)i.next();
    System.out.print("车商标码:"+foo.elementText("NO"));
    System.out.println("车主地点:"+foo.elementText("ADDR"));
   }
  }catch(Exceptione){
   e.printStackTrace();
  }
  System.out.println("运转工夫:"+(System.currentTimeMillis()-lasting)+"毫秒");
  }
  }

  10k损耗工夫:1097810931
  100k损耗工夫:297359172312
  1000k损耗工夫:2281235923442469
  10000k损耗工夫:20938199222003121078

  JDOM和DOM在功能测试时体现欠安,在测试10M文档时内存溢出。在小文档情形下还值得思索利用DOM和JDOM。固然JDOM的开辟者已申明他们希冀在正式刊行版前专注功能成绩,可是从功能概念来看,它的确没有值得保举的地方。别的,DOM还是一个十分好的选择。DOM完成普遍使用于多种编程言语。它仍是很多别的与XML相干的尺度的基本,由于它正式取得W3C保举(与基于非尺度的Java模子绝对),以是在某些范例的项目中大概也必要它(如在JavaScript中利用DOM)。

  SAX体现较好,这要依附于它特定的剖析体例。一个SAX检测行将到来的XML流,但并没有载进到内存(固然当XML流被读进时,会有部分文档临时埋没在内存中)。

  无疑,DOM4J是这场测试的得胜者,今朝很多开源项目中大批接纳DOM4J,比方赫赫有名的Hibernate也用DOM4J来读取XML设置文件。假如不思索可移植性,那就接纳DOM4J吧!

在ruby里才是一切皆对象。当然我不并不是很了解ruby,但是ruby确实是将语法简化得很好。
冷月葬花魂 该用户已被删除
沙发
发表于 2015-1-21 11:33:30 | 只看该作者
学Java必读的两个开源程序就是Jive和Pet Store.。 Jive是国外一个非常著名的BBS程序,完全开放源码。论坛的设计采用了很多先进的技术,如Cache、用户认证、Filter、XML等,而且论坛完全屏蔽了对数据库的访问,可以很轻易的在不同数据库中移植。论坛还有方便的安装和管理程序,这是我们平时编程时容易忽略的一部份(中国程序员一般只注重编程的技术含量,却完全不考虑用户的感受,这就是我们与国外软件的差距所在)。
兰色精灵 该用户已被删除
板凳
发表于 2015-1-21 11:33:30 | 只看该作者
Java是一种计算机编程语言,拥有跨平台、面向对java
兰色精灵 该用户已被删除
地板
发表于 2015-1-21 11:33:31 | 只看该作者
《JAVA语言程序设计》或《JAVA从入门到精通》这两本书开始学,等你编程有感觉的时候也可以回看一下。《JAVA读书笔记》这本书,因为讲的代码很多,也很容易看懂,涉及到面也到位。是你学习技术巩固的好书,学完后就看看《JAVA编程思想》这本书,找找一个自己写的代码跟书上的代码有什么不一样。
若相依 该用户已被删除
5#
发表于 2015-1-28 09:32:00 | 只看该作者
你现在最缺的是实际的工作经验,而不是书本上那些凭空想出来的程序。
不帅 该用户已被删除
6#
发表于 2015-2-5 10:53:54 | 只看该作者
一般学编程语言都是从C语开始学的,我也不例外,但还是可能不学过程语言而直接学面向对象语言的,你是刚接触语言,还是从C开始学比较好,基础会很深点,如果你直接学习JAVA也能上手,一般大家在学语言的时候都记一些语言的关键词,常有的包和接口等。再去做逻辑代码的编写,以后的学习过程都是从逻辑代码编写中提升的,所以这方面都是经验积累的。你要开始学习就从
莫相离 该用户已被删除
7#
发表于 2015-2-7 18:18:43 | 只看该作者
一直感觉JAVA很大,很杂,找不到学习方向,前两天在网上找到了这篇文章,感觉不错,给没有方向的我指了一个方向,先不管对不对,做下来再说。
因胸联盟 该用户已被删除
8#
发表于 2015-2-24 19:21:20 | 只看该作者
是一种使用者不需花费很多时间学习的语言
admin 该用户已被删除
9#
发表于 2015-3-6 14:47:33 | 只看该作者
[url]http://www.jdon.com/[/url]去下载,或到同济技术论坛的服务器[url]ftp://nro.shtdu.edu.cn[/url]去下,安装上有什么问题,可以到论坛上去提问。
老尸 该用户已被删除
10#
发表于 2015-3-8 15:34:24 | 只看该作者
是一种使网页(Web Page)产生生动活泼画面的语言
分手快乐 该用户已被删除
11#
发表于 2015-3-16 03:21:33 | 只看该作者
你现在最缺的是实际的工作经验,而不是书本上那些凭空想出来的程序。
精灵巫婆 该用户已被删除
12#
 楼主| 发表于 2015-3-16 13:07:30 | 只看该作者
Java 编程语言的风格十分接近C、C++语言。
蒙在股里 该用户已被删除
13#
发表于 2015-3-22 23:08:03 | 只看该作者
另外编写和运行Java程序需要JDK(包括JRE),在sun的官方网站上有下载,thinking in java第三版用的JDK版本是1.4,现在流行的版本1.5(sun称作J2SE 5.0,汗),不过听说Bruce的TIJ第四版国外已经出来了,是专门为J2SE 5.0而写的。
小女巫 该用户已被删除
14#
发表于 2015-3-30 03:25:20 | 只看该作者
是一种使网页(Web Page)产生生动活泼画面的语言
小魔女 该用户已被删除
15#
发表于 2015-4-6 19:10:14 | 只看该作者
你可以去承接一些项目做了,一开始可能有些困难,可是你有技术积累,又考虑周全,接下项目来可以迅速作完,相信大家以后都会来找你的,所以Money就哗啦啦的。。。。。。
第二个灵魂 该用户已被删除
16#
发表于 2015-4-15 19:05:02 | 只看该作者
是一种突破用户端机器环境和CPU
愤怒的大鸟 该用户已被删除
17#
发表于 2015-4-28 02:20:28 | 只看该作者
应用在电视机、电话、闹钟、烤面包机等家用电器的控制和通信。由于这些智能化家电的市场需求没有预期的高,Sun公司放弃了该项计划。随着1990年代互联网的发展
再见西城 该用户已被删除
18#
发表于 2015-5-4 10:14:30 | 只看该作者
我大二,Java也只学了一年,觉得还是看thinking in java好,有能力的话看英文原版(中文版翻的不怎么好),还能提高英文文档阅读能力。
飘飘悠悠 该用户已被删除
19#
发表于 2015-5-6 08:09:26 | 只看该作者
你就该学一学Servlet了。Servlet就是服务器端小程序,他负责生成发送给客户端的HTML文件。JSP在执行时,也是先转换成Servlet再运行的。虽说JSP理论上可以完全取代Servlet,这也是SUN推出JSP的本意,可是Servlet用来控制流程跳转还是挺方便的,也令程序更清晰。接下来你应该学习一下Javabean了,可能你早就看不管JSP在HTML中嵌Java代码的混乱方式了,这种方式跟ASP又有什么区别呢?
飘灵儿 该用户已被删除
20#
发表于 2015-5-11 09:48:18 | 只看该作者
科学超级计算机、移动电话和互联网,同时拥有全球最大的开发者专业社群。
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|Archiver|手机版|仓酷云 鄂ICP备14007578号-2

GMT+8, 2024-4-28 15:44

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表