??xml version="1.0" encoding="utf-8" standalone="yes"?>色播亚洲视频在线观看,91视频在线观看,91国在线观看http://www.aygfsteel.com/javainthinking/category/1490.html熊炼的个性空间和java学习之旅zh-cnTue, 27 Feb 2007 13:00:19 GMTTue, 27 Feb 2007 13:00:19 GMT60Web服务pd<本系列来自八q制blog>http://www.aygfsteel.com/javainthinking/articles/5036.html熊炼的个性空间和java学习之旅熊炼的个性空间和java学习之旅Sat, 21 May 2005 08:16:00 GMThttp://www.aygfsteel.com/javainthinking/articles/5036.htmlhttp://www.aygfsteel.com/javainthinking/comments/5036.htmlhttp://www.aygfsteel.com/javainthinking/articles/5036.html#Feedback0http://www.aygfsteel.com/javainthinking/comments/commentRss/5036.htmlhttp://www.aygfsteel.com/javainthinking/services/trackbacks/5036.htmlWeb服务pdQ一Q??/FONT>
Web服务pdQ二Q?Web服务的结?/FONT>
Web服务pdQ三Q?XML技?/FONT>

]]>
Java中四UXML解析技术之不完全测?[转蝲] http://www.aygfsteel.com/javainthinking/articles/5027.html熊炼的个性空间和java学习之旅熊炼的个性空间和java学习之旅Sat, 21 May 2005 04:18:00 GMThttp://www.aygfsteel.com/javainthinking/articles/5027.htmlhttp://www.aygfsteel.com/javainthinking/comments/5027.htmlhttp://www.aygfsteel.com/javainthinking/articles/5027.html#Feedback0http://www.aygfsteel.com/javainthinking/comments/commentRss/5027.htmlhttp://www.aygfsteel.com/javainthinking/services/trackbacks/5027.html在^时工作中Q难免会遇到把XML作ؓ数据存储格式。面对目前种cȝ多的解决ҎQ哪个最适合我们呢?在这文章中Q我对这四种LҎ做一个不完全评测Q仅仅针寚w历XMLq块来测试,因ؓ遍历XML是工作中使用最多的(臛_我认??

  预备

  试环境Q?

  AMD毒龙1.4G OC 1.5G?56M DDR333、Windows2000 Server SP4、Sun JDK 1.4.1+Eclipse 2.1+Resin 2.1.8Q在Debug模式下测试?

  XML文g格式如下Q?

  Q?xml version="1.0" encoding="GB2312"?Q<RESULTQ<VALUEQ?
  QNOQA1234Q?NOQ?
  QADDRQ四川省XX县XX镇XX路XDXXP/ADDRQ</VALUEQ<VALUEQ?
  QNOQB1234Q?NOQ?
  QADDRQ四川省XX市XX乡XX村XXl</ADDRQ</VALUEQ</RESULTQ?

  试ҎQ?

  采用JSP端调用Bean(至于Z么采用JSP来调用,请参考:http://blog.csdn.net/rosen/archive/2004/10/15/138324.aspx)Q让每一U方案分别解?0K?00K?000K?0000K的XML文gQ计其消耗时?单位:毫秒)?

  JSP文gQ?

  Q?@ page contentType="text/html; charset=gb2312" %Q<%@ page import="com.test.*"%Q?
  QhtmlQ<bodyQ<%String args[]={""};MyXMLReader.main(args);%Q</bodyQ</htmlQ?

  试

  首先出场的是DOM(JAXP Crimson解析?

  DOM是用与^台和语言无关的方式表CXML文档的官方W3C标准。DOM是以层次l构l织的节Ҏ信息片断的集合。这个层ơ结构允许开发h员在树中L特定信息。分析该l构通常需要加载整个文档和构造层ơ结构,然后才能做Q何工作。由于它是基于信息层ơ的Q因而DOM被认为是Z树或Z对象的。DOM以及q义的基于树的处理具有几个优炏V首先,׃树在内存中是持久的,因此可以修改它以便应用程序能Ҏ据和l构作出更改。它q可以在M时候在树中上下DQ而不是像SAX那样是一ơ性的处理。DOM使用h也要单得多?

  另一斚wQ对于特别大的文档,解析和加载整个文档可能很慢且很耗资源,因此使用其他手段来处理这L数据会更好。这些基于事件的模型Q比如SAX?

  Bean文gQ?

  package com.test;
  import java.io.*;import java.util.*;import org.w3c.dom.*;import javax.xml.parsers.*;
  public class MyXMLReader{
  public static void main(String arge[]){
  long lasting =System.currentTimeMillis();
  try{ 
   File f=new File("data_10k.xml");
   DocumentBuilderFactory factory=DocumentBuilderFactory.newInstance();
   DocumentBuilder builder=factory.newDocumentBuilder();
   Document doc = builder.parse(f);
   NodeList nl = doc.getElementsByTagName("VALUE");
   for (int i=0;iQnl.getLength();i++){
    System.out.print("车牌L:" + doc.getElementsByTagName("NO").item(i).getFirstChild().getNodeValue());
    System.out.println("车主地址:" + doc.getElementsByTagName("ADDR").item(i).getFirstChild().getNodeValue());
  }
  }catch(Exception e){
   e.printStackTrace();
  }
  System.out.println("q行旉Q?+(System.currentTimeMillis() - lasting)+"毫秒");}} 

  10k消耗时_265 203 219 172
  100k消耗时_9172 9016 8891 9000
  1000k消耗时_691719 675407 708375 739656
  10000k消耗时_OutOfMemoryError

  接着是SAX

  q种处理的优炚w常类g媒体的优点。分析能够立卛_始,而不是等待所有的数据被处理。而且Q由于应用程序只是在d数据时检查数据,因此不需要将数据存储在内存中。这对于大型文档来说是个巨大的优炏V事实上Q应用程序甚至不必解析整个文档;它可以在某个条g得到满时停止解析。一般来_SAXq比它的替代者DOM快许多?
   选择DOMq是选择SAXQ?

  对于需要自q写代码来处理XML文档的开发h员来_ 

  选择DOMq是SAX解析模型是一个非帔R要的设计决策?

  DOM采用建立树Şl构的方式访问XML文档Q而SAX采用的事件模型?

  DOM解析器把XML文档转化Z个包含其内容的树Qƈ可以Ҏq行遍历。用DOM解析模型的优Ҏ~程ҎQ开发h员只需要调用徏树的指oQ然后利用navigation APIs讉K所需的树节点来完成Q务。可以很Ҏ的添加和修改树中的元素。然而由于用DOM解析器的时候需要处理整个XML文档Q所以对性能和内存的要求比较高,其是遇到很大的XML文g的时候。由于它的遍历能力,DOM解析器常用于XML文档需要频J的改变的服务中?

  SAX解析器采用了Z事g的模型,它在解析XML文档的时候可以触发一pd的事Ӟ当发现给定的tag的时候,它可以激zM个回调方法,告诉该方法制定的标签已经扑ֈ。SAX对内存的要求通常会比较低Q因为它让开发h员自己来军_所要处理的tag。特别是当开发h员只需要处理文档中所包含的部分数据时QSAXq种扩展能力得到了更好的体现。但用SAX解析器的时候编码工作会比较困难Q而且很难同时讉K同一个文档中的多处不同数据?

  Bean文gQ?

  package com.test;import org.xml.sax.*;import org.xml.sax.helpers.*;import javax.xml.parsers.*;

        public class MyXMLReader extends DefaultHandler {
  java.util.Stack tags = new java.util.Stack();
  public MyXMLReader() {
        super();}

  public static void main(String args[]) {
  long lasting = System.currentTimeMillis();
  try {
   SAXParserFactory sf = SAXParserFactory.newInstance();
   SAXParser sp = sf.newSAXParser();
   MyXMLReader reader = new MyXMLReader();
   sp.parse(new InputSource("data_10k.xml"), reader);
  } catch (Exception e) {
   e.printStackTrace();
  }

  System.out.println("q行旉Q? + (System.currentTimeMillis() - lasting) + "毫秒");}
  public void characters(char ch[], int start, int length) throws SAXException {
  String tag = (String) tags.peek();

  if (tag.equals("NO")) { 
   System.out.print("车牌LQ? + new String(ch, start, length));}if (tag.equals("ADDR")) {
  System.out.println("地址:" + new String(ch, start, length));}}

  public void startElement(String uri,String localName,String qName,Attributes attrs) {
  tags.push(qName);}} 

  10k消耗时_110 47 109 78
  100k消耗时_344 406 375 422
  1000k消耗时_3234 3281 3688 3312
  10000k消耗时_32578 34313 31797 31890 30328

  然后是JDOM http://www.jdom.org/

  JDOM的目的是成ؓJava特定文档模型Q它化与XML的交互ƈ且比使用DOM实现更快。由于是W一个Java特定模型QJDOM一直得到大力推q和促进。正在考虑通过“Java规范hJSR-102”将它最l用作“Java标准扩展”。从2000q初已l开始了JDOM开发?

  JDOM与DOM主要有两斚w不同。首先,JDOM仅用具体类而不使用接口。这在某些方面简化了APIQ但是也限制了灵zL。第二,API大量使用了Collectionsc,化了那些已经熟悉q些cȝJava开发者的使用?

  JDOM文档声明其目的是“?0%(或更?的精力解?0%(或更?Java/XML问题?Ҏ学习曲线假定?0%)。JDOM对于大多数Java/XML应用E序来说当然是有用的Qƈ且大多数开发者发现API比DOMҎ理解得多。JDOMq包括对E序行ؓ的相当广泛检查以防止用户做Q何在XML中无意义的事。然而,它仍需要您充分理解XML以便做一些超出基本的工作(或者甚至理解某些情况下的错?。这也许是比学习DOM或JDOM接口都更有意义的工作?

  JDOM自n不包含解析器。它通常使用SAX2解析器来解析和验证输入XML文档(管它还可以以前构造的DOM表示作ؓ输入)。它包含一些{换器以将JDOM表示输出成SAX2事g、DOM模型或XML文本文档。JDOM是在Apache许可证变体下发布的开放源码?

  Bean文gQ?

  package com.test;
  import java.io.*;import java.util.*;import org.jdom.*;import org.jdom.input.*;
  public class MyXMLReader {
  public static void main(String arge[]) {
  long lasting = System.currentTimeMillis();
  try {
   SAXBuilder builder = new SAXBuilder(); 
   Document doc = builder.build(new File("data_10k.xml")); 
   Element foo = doc.getRootElement(); 
     List allChildren = foo.getChildren(); 

   for(int i=0;iQallChildren.size();i++) { 
    System.out.print("车牌L:" + ((Element)allChildren.get(i)).getChild("NO").getText());
    System.out.println("车主地址:" + ((Element)allChildren.get(i)).getChild("ADDR").getText());
   }

  } catch (Exception e) {
   e.printStackTrace();
  }
  System.out.println("q行旉Q? + (System.currentTimeMillis() - lasting) + "毫秒");}} 

  10k消耗时_125 62 187 94
  100k消耗时_704 625 640 766
  1000k消耗时_27984 30750 27859 30656
  10000k消耗时_OutOfMemoryError

  最后是DOM4J http://dom4j.sourceforge.net/

  虽然DOM4J代表了完全独立的开发结果,但最初,它是JDOM的一U智能分支。它合ƈ了许多超出基本XML文档表示的功能,包括集成的XPath支持、XML Schema支持以及用于大文档或化文档的基于事件的处理。它q提供了构徏文档表示的选项Q它通过DOM4J API和标准DOM接口hq行讉K功能。从2000下半q开始,它就一直处于开发之中?

  为支持所有这些功能,DOM4J使用接口和抽象基本类Ҏ。DOM4J大量使用了API中的Collectionsc,但是在许多情况下Q它q提供一些替代方法以允许更好的性能或更直接的编码方法。直接好处是Q虽然DOM4J付出了更复杂的API的代P但是它提供了比JDOM大得多的灉|性?

  在添加灵zL、XPath集成和对大文档处理的目标ӞDOM4J的目标与JDOM是一LQ针对Java开发者的易用性和直观操作。它q致力于成ؓ比JDOM更完整的解决ҎQ实现在本质上处理所有Java/XML问题的目标。在完成该目标时Q它比JDOM更少防止不正的应用E序行ؓ?

  DOM4J是一个非帔R怼U的Java XML APIQ具有性能优异、功能强大和极端易用使用的特点,同时它也是一个开放源代码的Y件。如今你可以看到来多的Java软g都在使用DOM4J来读写XMLQ特别值得一提的是连Sun的JAXM也在用DOM4J?

  Bean文gQ?
  package com.test;

  import java.io.*;import java.util.*;import org.dom4j.*;import org.dom4j.io.*;

  public class MyXMLReader {
  public static void main(String arge[]) {
  long lasting = System.currentTimeMillis();

  try {
   File f = new File("data_10k.xml");
   SAXReader reader = new SAXReader();
   Document doc = reader.read(f);
   Element root = doc.getRootElement();
   Element foo;

   for (Iterator i = root.elementIterator("VALUE"); i.hasNext();) {
    foo = (Element) i.next();
    System.out.print("车牌L:" + foo.elementText("NO"));
    System.out.println("车主地址:" + foo.elementText("ADDR"));
   }
  } catch (Exception e) {
   e.printStackTrace();
  }
  System.out.println("q行旉Q? + (System.currentTimeMillis() - lasting) + "毫秒");}} 

  10k消耗时_109 78 109 31
  100k消耗时_297 359 172 312
  1000k消耗时_2281 2359 2344 2469
  10000k消耗时_20938 19922 20031 21078

  JDOM和DOM在性能试时表C佻I在测?0M文档时内存溢出。在文档情况下q值得考虑使用DOM和JDOM。虽然JDOM的开发者已l说明他们期望在正式发行版前专注性能问题Q但是从性能观点来看Q它实没有值得推荐之处。另外,DOM仍是一个非常好的选择。DOM实现q泛应用于多U编E语a。它q是许多其它与XML相关的标准的基础Q因为它正式获得W3C推荐(与基于非标准的Java模型相对)Q所以在某些cd的项目中可能也需要它(如在JavaScript中用DOM)?

  SAX表现较好Q这要依赖于它特定的解析方式。一个SAX即到来的XML,但ƈ没有载入到内?当然当XML被dӞ会有部分文档暂时隐藏在内存中)?

  无疑QDOM4J是这场测试的莯者,目前许多开源项目中大量采用DOM4JQ例如大名鼎鼎的Hibernate也用DOM4J来读取XML配置文g。如果不考虑可移植性,那就采用DOM4J吧!

注意Q当xml数据的Ş式作Z递时Q要获取一条条的纪录是比较适宜于采用domQ虽然它对系l(内存Q性能{)有较高的要求Q但是一般的服务器都可满上G的xml文档的处理?BR>      当需要对xml的某些内Ҏ某些节点的特定访问时Q或需要一及时C件相应时Q可以用sax来处理。它是基于时间处理机制的Q在~程Ӟ通过重蝲一些事件方法,来获得对xml文档的处理?/P>

有关xml的编码,InputStreamReader和xmlReader的关p:
  通常的DOM和SAX对于用ascii~码的文档,通过用InputStreamReaderdxml文档Q后变成了unicode码,然后不能?BR>  XMlREader来处理,出现错误的原因是Q遇到无效的unicode的字W。(当你用system.out.println()输出是没有Q何问题,因ؓ它能自动转成本地机的~码Q?BR>  解决的方法:
  BufferedReader br=new BufferedReader(new InputStreamReader(new FileInputStream(f),"ISO8859-1"));
  q样可以限定它的编码,q样没有问题?BR>String 的长度问题:String cd安标准来说没有长度限Ӟ但是一般jdk中String的最大长度是4G?BR>String与BufferedString关系:在不涉及到字W串有效的大量处理,通常使用String. BufferedString在处理字W串的大量处理上有优?



]]>
վ֩ģ壺 ͨ| | | | ݸ| | | | ɽ| | | | | ͺ| | ̨| | Į| | ʳ| | | ƽ| | | | | ԭ| | | | IJ| ƺ| | ݳ| | β| ƽ| | | |