??xml version="1.0" encoding="utf-8" standalone="yes"?>午夜精品在线视频,欧美精品播放,成人毛片av在线http://www.aygfsteel.com/gm_jing/category/43406.html生活之点Ҏ?/description>zh-cnTue, 05 Jan 2010 22:28:11 GMTTue, 05 Jan 2010 22:28:11 GMT60xml 解析Ҏ[引用]http://www.aygfsteel.com/gm_jing/articles/308243.html黎夕黎夕Tue, 05 Jan 2010 02:44:00 GMThttp://www.aygfsteel.com/gm_jing/articles/308243.htmlhttp://www.aygfsteel.com/gm_jing/comments/308243.htmlhttp://www.aygfsteel.com/gm_jing/articles/308243.html#Feedback0http://www.aygfsteel.com/gm_jing/comments/commentRss/308243.htmlhttp://www.aygfsteel.com/gm_jing/services/trackbacks/308243.html
Xml代码 复制代码
  1.   Q?xml version="1.0" encoding="GB2312"?Q?nbsp;   
  2.   QRESULTQ?nbsp;   
  3.   QVALUEQ?nbsp;   
  4.   QNOQA1234Q?NOQ?nbsp;   
  5.   QADDRQ四川省XX县XX镇XX路XDXXP/ADDRQ?nbsp;   
  6.   Q?VALUEQ?nbsp;   
  7.   QVALUEQ?nbsp;   
  8.   QNOQB1234Q?NOQ?nbsp;   
  9.   QADDRQ四川省XX市XX乡XX村XXl</ADDRQ?nbsp;   
  10.   Q?VALUEQ?nbsp;   
  11.   Q?RESULTQ?nbsp;  

 首先出场的是 DOMQJAXP Crimson 解析器)

  DOM 是用与^台和语言无关的方式表C?XML 文档的官?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?

Java代码 复制代码
  1.  package com.test;    
  2.   
  3.   import java.io.*;    
  4.   import java.util.*;    
  5.   import org.w3c.dom.*;    
  6.   import javax.xml.parsers.*;    
  7.   
  8.   public class MyXMLReader{    
  9.   
  10.   public static void main(String arge[]){    
  11.   long lasting =System.currentTimeMillis();    
  12.   try{    
  13.    File f=new File("data_10k.xml");    
  14.    DocumentBuilderFactory factory=DocumentBuilderFactory.newInstance();    
  15.    DocumentBuilder builder=factory.newDocumentBuilder();    
  16.    Document doc = builder.parse(f);    
  17.    NodeList nl = doc.getElementsByTagName("VALUE");    
  18.    for (int i=0;iQnl.getLength();i++){    
  19.     System.out.print("车牌L:" + doc.getElementsByTagName("NO").item(i).getFirstChild().getNodeValue());    
  20.     System.out.println(" 车主地址:" + doc.getElementsByTagName("ADDR").item(i).getFirstChild().getNodeValue());    
  21.   }    
  22.   }catch(Exception e){    
  23.    e.printStackTrace();    
  24.   }    
  25.   System.out.println("q行旉Q?+(System.currentTimeMillis() - lasting)+" 毫秒");    
  26.   }    
  27.   }   

   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得到满时停止解析。一般来_SAX q比它的替代?DOM 快许多?

   选择 DOM q是选择 SAX Q?

  对于需要自q写代码来处理 XML 文档的开发h员来_选择 DOM q是 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员只需要处理文档中所包含的部分数据时QSAX q种扩展能力得到了更好的体现。但?SAX 解析器的时候编码工作会比较困难Q而且很难同时讉K同一个文档中的多处不同数据?

  Bean文gQ?
Java代码 复制代码
  1.   package com.test;    
  2.   import org.xml.sax.*;    
  3.   import org.xml.sax.helpers.*;    
  4.   import javax.xml.parsers.*;    
  5.   
  6.   public class MyXMLReader extends DefaultHandler {    
  7.   
  8.   java.util.Stack tags = new java.util.Stack();    
  9.   
  10.   public MyXMLReader() {    
  11.   super();    
  12.   }    
  13.   
  14.   public static void main(String args[]) {    
  15.   long lasting = System.currentTimeMillis();    
  16.   try {    
  17.    SAXParserFactory sf = SAXParserFactory.newInstance();    
  18.    SAXParser sp = sf.newSAXParser();    
  19.    MyXMLReader reader = new MyXMLReader();    
  20.    sp.parse(new InputSource("data_10k.xml"), reader);    
  21.   } catch (Exception e) {    
  22.    e.printStackTrace();    
  23.   }    
  24.   System.out.println("q行旉Q? + (System.currentTimeMillis() - lasting) + " 毫秒");    
  25.   }    
  26.   
  27.   public void characters(char ch[], int start, int length) throws SAXException {    
  28.   String tag = (String) tags.peek();    
  29.   if (tag.equals("NO")) {    
  30.    System.out.print("车牌LQ? + new String(ch, start, length));    
  31.   }    
  32.   if (tag.equals("ADDR")) {    
  33.   System.out.println(" 地址:" + new String(ch, start, length));    
  34.   }    
  35.   }    
  36.   
  37.   public void startElement(    
  38.   String uri,    
  39.   String localName,    
  40.   String qName,    
  41.   Attributes attrs) {    
  42.   tags.push(qName);    
  43.   }    
  44.   }   

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 规范h JSR-102”它最l用?#8220;Java 标准扩展”。从 2000 q初已l开始了 JDOM 开发?

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

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

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

  Bean文gQ?
Java代码 复制代码
  1.   package com.test;    
  2.   
  3.   import java.io.*;    
  4.   import java.util.*;    
  5.   import org.jdom.*;    
  6.   import org.jdom.input.*;    
  7.   
  8.   public class MyXMLReader {    
  9.   
  10.   public static void main(String arge[]) {    
  11.   long lasting = System.currentTimeMillis();    
  12.   try {    
  13.    SAXBuilder builder = new SAXBuilder();    
  14.    Document doc = builder.build(new File("data_10k.xml"));    
  15.    Element foo = doc.getRootElement();    
  16.    List allChildren = foo.getChildren();    
  17.    for(int i=0;iQallChildren.size();i++) {    
  18.     System.out.print("车牌L:" + ((Element)allChildren.get(i)).getChild("NO").getText());    
  19.     System.out.println(" 车主地址:" + ((Element)allChildren.get(i)).getChild("ADDR").getText());    
  20.    }    
  21.   } catch (Exception e) {    
  22.    e.printStackTrace();    
  23.   }    
  24.   System.out.println("q行旉Q? + (System.currentTimeMillis() - lasting) + " 毫秒");    
  25.   }    
  26.   }   

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 中的 Collections c,但是在许多情况下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?
Java代码 复制代码
  1.   package com.test;    
  2.   
  3.   import java.io.*;    
  4.   import java.util.*;    
  5.   import org.dom4j.*;    
  6.   import org.dom4j.io.*;    
  7.   
  8.   public class MyXMLReader {    
  9.   
  10.   public static void main(String arge[]) {    
  11.   long lasting = System.currentTimeMillis();    
  12.   try {    
  13.    File f = new File("data_10k.xml");    
  14.    SAXReader reader = new SAXReader();    
  15.    Document doc = reader.read(f);    
  16.    Element root = doc.getRootElement();    
  17.    Element foo;    
  18.    for (Iterator i = root.elementIterator("VALUE"); i.hasNext();) {    
  19.     foo = (Element) i.next();    
  20.     System.out.print("车牌L:" + foo.elementText("NO"));    
  21.     System.out.println(" 车主地址:" + foo.elementText("ADDR"));    
  22.    }    
  23.   } catch (Exception e) {    
  24.    e.printStackTrace();    
  25.   }    
  26.   System.out.println("q行旉Q? + (System.currentTimeMillis() - lasting) + " 毫秒");    
  27.   }    
  28.   }   

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

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

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

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

黎夕 2010-01-05 10:44 发表评论
]]>
վ֩ģ壺 ԭ| | | | | ¤| ͩ| | ɽ| | | | | | ˮ| | | ˱| | ˳| ͨ| пǰ| ½| | п| ʩ| | | Ͽ| Զ| | | | | ߱| Ӣ| | ̨| | ˮ| |