﻿<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>BlogJava-把永恒在一刹那间收藏-文章分类-xml</title><link>http://www.blogjava.net/gm_jing/category/43406.html</link><description>生活之点点滴滴</description><language>zh-cn</language><lastBuildDate>Tue, 05 Jan 2010 22:28:11 GMT</lastBuildDate><pubDate>Tue, 05 Jan 2010 22:28:11 GMT</pubDate><ttl>60</ttl><item><title>xml 解析方法[引用]</title><link>http://www.blogjava.net/gm_jing/articles/308243.html</link><dc:creator>黎夕</dc:creator><author>黎夕</author><pubDate>Tue, 05 Jan 2010 02:44:00 GMT</pubDate><guid>http://www.blogjava.net/gm_jing/articles/308243.html</guid><wfw:comment>http://www.blogjava.net/gm_jing/comments/308243.html</wfw:comment><comments>http://www.blogjava.net/gm_jing/articles/308243.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/gm_jing/comments/commentRss/308243.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/gm_jing/services/trackbacks/308243.html</trackback:ping><description><![CDATA[XML 文件格式如下： <br />
<div class="dp-highlighter">
<div class="bar">
<div class="tools">Xml代码 <a title="复制代码" onclick="dp.sh.Toolbar.CopyToClipboard(this);return false;" href="http://aronlulu.javaeye.com/blog/316917#"><img alt="复制代码" src="http://aronlulu.javaeye.com/images/icon_copy.gif" /></a></div>
</div>
<ol class="dp-xml">
    <li><span><span>　　＜?xml&nbsp;</span><span class="attribute">version</span><span>=</span><span class="attribute-value">"1.0"</span><span>&nbsp;</span><span class="attribute">encoding</span><span>=</span><span class="attribute-value">"GB2312"</span><span>?＞&nbsp; &nbsp;&nbsp;</span></span></li>
    <li><span>　　＜RESULT＞&nbsp; &nbsp;&nbsp;</span></li>
    <li><span>　　＜VALUE＞&nbsp; &nbsp;&nbsp;</span></li>
    <li><span>　　＜NO＞A1234＜/NO＞&nbsp; &nbsp;&nbsp;</span></li>
    <li><span>　　＜ADDR＞四川省XX县XX镇XX路X段XX号＜/ADDR＞&nbsp; &nbsp;&nbsp;</span></li>
    <li><span>　　＜/VALUE＞&nbsp; &nbsp;&nbsp;</span></li>
    <li><span>　　＜VALUE＞&nbsp; &nbsp;&nbsp;</span></li>
    <li><span>　　＜NO＞B1234＜/NO＞&nbsp; &nbsp;&nbsp;</span></li>
    <li><span>　　＜ADDR＞四川省XX市XX乡XX村XX组＜/ADDR＞&nbsp; &nbsp;&nbsp;</span></li>
    <li><span>　　＜/VALUE＞&nbsp; &nbsp;&nbsp;</span></li>
    <li><span>　　＜/RESULT＞&nbsp;&nbsp;&nbsp;</span></li>
</ol>
</div>
<pre class="xml" style="display: none" name="code">　　＜?xml version="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＞
</pre>
<br />
　首先出场的是 DOM（JAXP Crimson 解析器） <br />
<br />
　　DOM 是用与平台和语言无关的方式表示 XML 文档的官方 W3C 标准。DOM 是以层次结构组织的节点或信息片断的集合。这个层次结构允许开发人员在树中寻找特定信息。分析该结构通常需要加载整个文档和构造层次结构，然后才能做任何工作。由于它是基于信息层次的，因而 DOM 被认为是基于树或基于对象的。DOM 以及广义的基于树的处理具有几个优点。首先，由于树在内存中是持久的，因此可以修改它以便应用程序能对数据和结构作出更改。它还可以在任何时候在树中上下导航，而不是像 SAX 那样是一次性的处理。DOM 使用起来也要简单得多。 <br />
<br />
　　另一方面，对于特别大的文档，解析和加载整个文档可能很慢且很耗资源，因此使用其他手段来处理这样的数据会更好。这些基于事件的模型，比如 SAX。 <br />
<br />
<div class="dp-highlighter">
<div class="bar">
<div class="tools">Java代码 <a title="复制代码" onclick="dp.sh.Toolbar.CopyToClipboard(this);return false;" href="http://aronlulu.javaeye.com/blog/316917#"><img alt="复制代码" src="http://aronlulu.javaeye.com/images/icon_copy.gif" /></a></div>
</div>
<ol class="dp-j">
    <li><span><span>　</span><span class="keyword">package</span><span>&nbsp;com.test;&nbsp; &nbsp;&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;</span></li>
    <li><span>　　</span><span class="keyword">import</span><span>&nbsp;java.io.*;&nbsp; &nbsp;&nbsp;</span></span></li>
    <li><span>　　</span><span class="keyword">import</span><span>&nbsp;java.util.*;&nbsp; &nbsp;&nbsp;</span></span></li>
    <li><span>　　</span><span class="keyword">import</span><span>&nbsp;org.w3c.dom.*;&nbsp; &nbsp;&nbsp;</span></span></li>
    <li><span>　　</span><span class="keyword">import</span><span>&nbsp;javax.xml.parsers.*;&nbsp; &nbsp;&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;</span></li>
    <li><span>　　</span><span class="keyword">public</span><span>&nbsp;</span><span class="keyword">class</span><span>&nbsp;MyXMLReader{&nbsp; &nbsp;&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;</span></li>
    <li><span>　　</span><span class="keyword">public</span><span>&nbsp;</span><span class="keyword">static</span><span>&nbsp;</span><span class="keyword">void</span><span>&nbsp;main(String&nbsp;arge[]){&nbsp; &nbsp;&nbsp;</span></span></li>
    <li><span>　　</span><span class="keyword">long</span><span>&nbsp;lasting&nbsp;=System.currentTimeMillis();&nbsp; &nbsp;&nbsp;</span></span></li>
    <li><span>　　</span><span class="keyword">try</span><span>{&nbsp; &nbsp;&nbsp;</span></span></li>
    <li><span>　　　File&nbsp;f=</span><span class="keyword">new</span><span>&nbsp;File(</span><span class="string">"data_10k.xml"</span><span>);&nbsp; &nbsp;&nbsp;</span></span></li>
    <li><span>　　　DocumentBuilderFactory&nbsp;factory=DocumentBuilderFactory.newInstance();&nbsp; &nbsp;&nbsp;</span></li>
    <li><span>　　　DocumentBuilder&nbsp;builder=factory.newDocumentBuilder();&nbsp; &nbsp;&nbsp;</span></li>
    <li><span>　　　Document&nbsp;doc&nbsp;=&nbsp;builder.parse(f);&nbsp; &nbsp;&nbsp;</span></li>
    <li><span>　　　NodeList&nbsp;nl&nbsp;=&nbsp;doc.getElementsByTagName(</span><span class="string">"VALUE"</span><span>);&nbsp; &nbsp;&nbsp;</span></span></li>
    <li><span>　　　</span><span class="keyword">for</span><span>&nbsp;(</span><span class="keyword">int</span><span>&nbsp;i=</span><span class="number">0</span><span>;i＜nl.getLength();i++){&nbsp; &nbsp;&nbsp;</span></span></li>
    <li><span>　　　　System.out.print(</span><span class="string">"车牌号码:"</span><span>&nbsp;+&nbsp;doc.getElementsByTagName(</span><span class="string">"NO"</span><span>).item(i).getFirstChild().getNodeValue());&nbsp; &nbsp;&nbsp;</span></span></li>
    <li><span>　　　　System.out.println(</span><span class="string">"&nbsp;车主地址:"</span><span>&nbsp;+&nbsp;doc.getElementsByTagName(</span><span class="string">"ADDR"</span><span>).item(i).getFirstChild().getNodeValue());&nbsp; &nbsp;&nbsp;</span></span></li>
    <li><span>　　}&nbsp; &nbsp;&nbsp;</span></li>
    <li><span>　　}</span><span class="keyword">catch</span><span>(Exception&nbsp;e){&nbsp; &nbsp;&nbsp;</span></span></li>
    <li><span>　　　e.printStackTrace();&nbsp; &nbsp;&nbsp;</span></li>
    <li><span>　　}&nbsp; &nbsp;&nbsp;</span></li>
    <li><span>　　System.out.println(</span><span class="string">"运行时间："</span><span>+(System.currentTimeMillis()&nbsp;-&nbsp;lasting)+</span><span class="string">"&nbsp;毫秒"</span><span>);&nbsp; &nbsp;&nbsp;</span></span></li>
    <li><span>　　}&nbsp; &nbsp;&nbsp;</span></li>
    <li><span>　　}&nbsp;&nbsp;&nbsp;</span></li>
</ol>
</div>
<pre class="java" style="display: none" name="code">　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;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(Exception e){
　　　e.printStackTrace();
　　}
　　System.out.println("运行时间："+(System.currentTimeMillis() - lasting)+" 毫秒");
　　}
　　}
</pre>
<br />
&nbsp;&nbsp; 10k消耗时间：265 203 219 172 <br />
　　100k消耗时间：9172 9016 8891 9000 <br />
　　1000k消耗时间：691719 675407 708375 739656 <br />
　　10000k消耗时间：OutOfMemoryError <br />
<br />
接着是 SAX <br />
<br />
　　这种处理的优点非常类似于流媒体的优点。分析能够立即开始，而不是等待所有的数据被处理。而且，由于应用程序只是在读取数据时检查数据，因此不需要将数据存储在内存中。这对于大型文档来说是个巨大的优点。事实上，应用程序甚至不必解析整个文档；它可以在某个条件得到满足时停止解析。一般来说，SAX 还比它的替代者 DOM 快许多。 <br />
<br />
　　 选择 DOM 还是选择 SAX ？ <br />
<br />
　　对于需要自己编写代码来处理 XML 文档的开发人员来说，选择 DOM 还是 SAX 解析模型是一个非常重要的设计决策。 <br />
<br />
　　DOM 采用建立树形结构的方式访问 XML 文档，而 SAX 采用的事件模型。 <br />
<br />
　　DOM 解析器把 XML 文档转化为一个包含其内容的树，并可以对树进行遍历。用 DOM 解析模型的优点是编程容易，开发人员只需要调用建树的指令，然后利用navigation APIs访问所需的树节点来完成任务。可以很容易的添加和修改树中的元素。然而由于使用 DOM 解析器的时候需要处理整个 XML 文档，所以对性能和内存的要求比较高，尤其是遇到很大的 XML 文件的时候。由于它的遍历能力，DOM 解析器常用于 XML 文档需要频繁的改变的服务中。 <br />
<br />
　　SAX 解析器采用了基于事件的模型，它在解析 XML 文档的时候可以触发一系列的事件，当发现给定的tag的时候，它可以激活一个回调方法，告诉该方法制定的标签已经找到。SAX 对内存的要求通常会比较低，因为它让开发人员自己来决定所要处理的tag。特别是当开发人员只需要处理文档中所包含的部分数据时，SAX 这种扩展能力得到了更好的体现。但用 SAX 解析器的时候编码工作会比较困难，而且很难同时访问同一个文档中的多处不同数据。 <br />
<br />
　　Bean文件： <br />
<div class="dp-highlighter">
<div class="bar">
<div class="tools">Java代码 <a title="复制代码" onclick="dp.sh.Toolbar.CopyToClipboard(this);return false;" href="http://aronlulu.javaeye.com/blog/316917#"><img alt="复制代码" src="http://aronlulu.javaeye.com/images/icon_copy.gif" /></a></div>
</div>
<ol class="dp-j">
    <li><span><span>　　</span><span class="keyword">package</span><span>&nbsp;com.test;&nbsp; &nbsp;&nbsp;</span></span></li>
    <li><span>　　</span><span class="keyword">import</span><span>&nbsp;org.xml.sax.*;&nbsp; &nbsp;&nbsp;</span></span></li>
    <li><span>　　</span><span class="keyword">import</span><span>&nbsp;org.xml.sax.helpers.*;&nbsp; &nbsp;&nbsp;</span></span></li>
    <li><span>　　</span><span class="keyword">import</span><span>&nbsp;javax.xml.parsers.*;&nbsp; &nbsp;&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;</span></li>
    <li><span>　　</span><span class="keyword">public</span><span>&nbsp;</span><span class="keyword">class</span><span>&nbsp;MyXMLReader&nbsp;</span><span class="keyword">extends</span><span>&nbsp;DefaultHandler&nbsp;{&nbsp; &nbsp;&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;</span></li>
    <li><span>　　java.util.Stack&nbsp;tags&nbsp;=&nbsp;</span><span class="keyword">new</span><span>&nbsp;java.util.Stack();&nbsp; &nbsp;&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;</span></li>
    <li><span>　　</span><span class="keyword">public</span><span>&nbsp;MyXMLReader()&nbsp;{&nbsp; &nbsp;&nbsp;</span></span></li>
    <li><span>　　</span><span class="keyword">super</span><span>();&nbsp; &nbsp;&nbsp;</span></span></li>
    <li><span>　　}&nbsp; &nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;</span></li>
    <li><span>　　</span><span class="keyword">public</span><span>&nbsp;</span><span class="keyword">static</span><span>&nbsp;</span><span class="keyword">void</span><span>&nbsp;main(String&nbsp;args[])&nbsp;{&nbsp; &nbsp;&nbsp;</span></span></li>
    <li><span>　　</span><span class="keyword">long</span><span>&nbsp;lasting&nbsp;=&nbsp;System.currentTimeMillis();&nbsp; &nbsp;&nbsp;</span></span></li>
    <li><span>　　</span><span class="keyword">try</span><span>&nbsp;{&nbsp; &nbsp;&nbsp;</span></span></li>
    <li><span>　　　SAXParserFactory&nbsp;sf&nbsp;=&nbsp;SAXParserFactory.newInstance();&nbsp; &nbsp;&nbsp;</span></li>
    <li><span>　　　SAXParser&nbsp;sp&nbsp;=&nbsp;sf.newSAXParser();&nbsp; &nbsp;&nbsp;</span></li>
    <li><span>　　　MyXMLReader&nbsp;reader&nbsp;=&nbsp;</span><span class="keyword">new</span><span>&nbsp;MyXMLReader();&nbsp; &nbsp;&nbsp;</span></span></li>
    <li><span>　　　sp.parse(</span><span class="keyword">new</span><span>&nbsp;InputSource(</span><span class="string">"data_10k.xml"</span><span>),&nbsp;reader);&nbsp; &nbsp;&nbsp;</span></span></li>
    <li><span>　　}&nbsp;</span><span class="keyword">catch</span><span>&nbsp;(Exception&nbsp;e)&nbsp;{&nbsp; &nbsp;&nbsp;</span></span></li>
    <li><span>　　　e.printStackTrace();&nbsp; &nbsp;&nbsp;</span></li>
    <li><span>　　}&nbsp; &nbsp;&nbsp;</span></li>
    <li><span>　　System.out.println(</span><span class="string">"运行时间："</span><span>&nbsp;+&nbsp;(System.currentTimeMillis()&nbsp;-&nbsp;lasting)&nbsp;+&nbsp;</span><span class="string">"&nbsp;毫秒"</span><span>);&nbsp; &nbsp;&nbsp;</span></span></li>
    <li><span>　　}&nbsp; &nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;</span></li>
    <li><span>　　</span><span class="keyword">public</span><span>&nbsp;</span><span class="keyword">void</span><span>&nbsp;characters(</span><span class="keyword">char</span><span>&nbsp;ch[],&nbsp;</span><span class="keyword">int</span><span>&nbsp;start,&nbsp;</span><span class="keyword">int</span><span>&nbsp;length)&nbsp;</span><span class="keyword">throws</span><span>&nbsp;SAXException&nbsp;{&nbsp; &nbsp;&nbsp;</span></span></li>
    <li><span>　　String&nbsp;tag&nbsp;=&nbsp;(String)&nbsp;tags.peek();&nbsp; &nbsp;&nbsp;</span></li>
    <li><span>　　</span><span class="keyword">if</span><span>&nbsp;(tag.equals(</span><span class="string">"NO"</span><span>))&nbsp;{&nbsp; &nbsp;&nbsp;</span></span></li>
    <li><span>　　　System.out.print(</span><span class="string">"车牌号码："</span><span>&nbsp;+&nbsp;</span><span class="keyword">new</span><span>&nbsp;String(ch,&nbsp;start,&nbsp;length));&nbsp; &nbsp;&nbsp;</span></span></li>
    <li><span>　　}&nbsp; &nbsp;&nbsp;</span></li>
    <li><span>　　</span><span class="keyword">if</span><span>&nbsp;(tag.equals(</span><span class="string">"ADDR"</span><span>))&nbsp;{&nbsp; &nbsp;&nbsp;</span></span></li>
    <li><span>　　System.out.println(</span><span class="string">"&nbsp;地址:"</span><span>&nbsp;+&nbsp;</span><span class="keyword">new</span><span>&nbsp;String(ch,&nbsp;start,&nbsp;length));&nbsp; &nbsp;&nbsp;</span></span></li>
    <li><span>　　}&nbsp; &nbsp;&nbsp;</span></li>
    <li><span>　　}&nbsp; &nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;</span></li>
    <li><span>　　</span><span class="keyword">public</span><span>&nbsp;</span><span class="keyword">void</span><span>&nbsp;startElement(&nbsp; &nbsp;&nbsp;</span></span></li>
    <li><span>　　String&nbsp;uri,&nbsp; &nbsp;&nbsp;</span></li>
    <li><span>　　String&nbsp;localName,&nbsp; &nbsp;&nbsp;</span></li>
    <li><span>　　String&nbsp;qName,&nbsp; &nbsp;&nbsp;</span></li>
    <li><span>　　Attributes&nbsp;attrs)&nbsp;{&nbsp; &nbsp;&nbsp;</span></li>
    <li><span>　　tags.push(qName);&nbsp; &nbsp;&nbsp;</span></li>
    <li><span>　　}&nbsp; &nbsp;&nbsp;</span></li>
    <li><span>　　}&nbsp;&nbsp;&nbsp;</span></li>
</ol>
</div>
<pre class="java" style="display: none" name="code">　　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("运行时间：" + (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("车牌号码：" + 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);
　　}
　　}
</pre>
<br />
10k消耗时间：110 47 109 78 <br />
　　100k消耗时间：344 406 375 422 <br />
　　1000k消耗时间：3234 3281 3688 3312 <br />
　　10000k消耗时间：32578 34313 31797 31890 30328 <br />
<br />
　然后是 JDOM http://www.jdom.org/ <br />
<br />
　　JDOM 的目的是成为 Java 特定文档模型，它简化与 XML 的交互并且比使用 DOM 实现更快。由于是第一个 Java 特定模型，JDOM 一直得到大力推广和促进。正在考虑通过&#8220;Java 规范请求 JSR-102&#8221;将它最终用作&#8220;Java 标准扩展&#8221;。从 2000 年初就已经开始了 JDOM 开发。 <br />
<br />
　　JDOM 与 DOM 主要有两方面不同。首先，JDOM 仅使用具体类而不使用接口。这在某些方面简化了 API，但是也限制了灵活性。第二，API 大量使用了 Collections 类，简化了那些已经熟悉这些类的 Java 开发者的使用。 <br />
<br />
　　JDOM 文档声明其目的是&#8220;使用 20%（或更少）的精力解决 80%（或更多）Java/XML 问题&#8221;（根据学习曲线假定为 20%）。JDOM 对于大多数 Java/XML 应用程序来说当然是有用的，并且大多数开发者发现 API 比 DOM 容易理解得多。JDOM 还包括对程序行为的相当广泛检查以防止用户做任何在 XML 中无意义的事。然而，它仍需要您充分理解 XML 以便做一些超出基本的工作（或者甚至理解某些情况下的错误）。这也许是比学习 DOM 或 JDOM 接口都更有意义的工作。 <br />
<br />
　　JDOM 自身不包含解析器。它通常使用 SAX2 解析器来解析和验证输入 XML 文档（尽管它还可以将以前构造的 DOM 表示作为输入）。它包含一些转换器以将 JDOM 表示输出成 SAX2 事件流、DOM 模型或 XML 文本文档。JDOM 是在 Apache 许可证变体下发布的开放源码。 <br />
<br />
　　Bean文件： <br />
<div class="dp-highlighter">
<div class="bar">
<div class="tools">Java代码 <a title="复制代码" onclick="dp.sh.Toolbar.CopyToClipboard(this);return false;" href="http://aronlulu.javaeye.com/blog/316917#"><img alt="复制代码" src="http://aronlulu.javaeye.com/images/icon_copy.gif" /></a></div>
</div>
<ol class="dp-j">
    <li><span><span>　　</span><span class="keyword">package</span><span>&nbsp;com.test;&nbsp; &nbsp;&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;</span></li>
    <li><span>　　</span><span class="keyword">import</span><span>&nbsp;java.io.*;&nbsp; &nbsp;&nbsp;</span></span></li>
    <li><span>　　</span><span class="keyword">import</span><span>&nbsp;java.util.*;&nbsp; &nbsp;&nbsp;</span></span></li>
    <li><span>　　</span><span class="keyword">import</span><span>&nbsp;org.jdom.*;&nbsp; &nbsp;&nbsp;</span></span></li>
    <li><span>　　</span><span class="keyword">import</span><span>&nbsp;org.jdom.input.*;&nbsp; &nbsp;&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;</span></li>
    <li><span>　　</span><span class="keyword">public</span><span>&nbsp;</span><span class="keyword">class</span><span>&nbsp;MyXMLReader&nbsp;{&nbsp; &nbsp;&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;</span></li>
    <li><span>　　</span><span class="keyword">public</span><span>&nbsp;</span><span class="keyword">static</span><span>&nbsp;</span><span class="keyword">void</span><span>&nbsp;main(String&nbsp;arge[])&nbsp;{&nbsp; &nbsp;&nbsp;</span></span></li>
    <li><span>　　</span><span class="keyword">long</span><span>&nbsp;lasting&nbsp;=&nbsp;System.currentTimeMillis();&nbsp; &nbsp;&nbsp;</span></span></li>
    <li><span>　　</span><span class="keyword">try</span><span>&nbsp;{&nbsp; &nbsp;&nbsp;</span></span></li>
    <li><span>　　　SAXBuilder&nbsp;builder&nbsp;=&nbsp;</span><span class="keyword">new</span><span>&nbsp;SAXBuilder();&nbsp; &nbsp;&nbsp;</span></span></li>
    <li><span>　　　Document&nbsp;doc&nbsp;=&nbsp;builder.build(</span><span class="keyword">new</span><span>&nbsp;File(</span><span class="string">"data_10k.xml"</span><span>));&nbsp; &nbsp;&nbsp;</span></span></li>
    <li><span>　　　Element&nbsp;foo&nbsp;=&nbsp;doc.getRootElement();&nbsp; &nbsp;&nbsp;</span></li>
    <li><span>　　　List&nbsp;allChildren&nbsp;=&nbsp;foo.getChildren();&nbsp; &nbsp;&nbsp;</span></li>
    <li><span>　　　</span><span class="keyword">for</span><span>(</span><span class="keyword">int</span><span>&nbsp;i=</span><span class="number">0</span><span>;i＜allChildren.size();i++)&nbsp;{&nbsp; &nbsp;&nbsp;</span></span></li>
    <li><span>　　　　System.out.print(</span><span class="string">"车牌号码:"</span><span>&nbsp;+&nbsp;((Element)allChildren.get(i)).getChild(</span><span class="string">"NO"</span><span>).getText());&nbsp; &nbsp;&nbsp;</span></span></li>
    <li><span>　　　　System.out.println(</span><span class="string">"&nbsp;车主地址:"</span><span>&nbsp;+&nbsp;((Element)allChildren.get(i)).getChild(</span><span class="string">"ADDR"</span><span>).getText());&nbsp; &nbsp;&nbsp;</span></span></li>
    <li><span>　　　}&nbsp; &nbsp;&nbsp;</span></li>
    <li><span>　　}&nbsp;</span><span class="keyword">catch</span><span>&nbsp;(Exception&nbsp;e)&nbsp;{&nbsp; &nbsp;&nbsp;</span></span></li>
    <li><span>　　　e.printStackTrace();&nbsp; &nbsp;&nbsp;</span></li>
    <li><span>　　}&nbsp; &nbsp;&nbsp;</span></li>
    <li><span>　　System.out.println(</span><span class="string">"运行时间："</span><span>&nbsp;+&nbsp;(System.currentTimeMillis()&nbsp;-&nbsp;lasting)&nbsp;+&nbsp;</span><span class="string">"&nbsp;毫秒"</span><span>);&nbsp; &nbsp;&nbsp;</span></span></li>
    <li><span>　　}&nbsp; &nbsp;&nbsp;</span></li>
    <li><span>　　}&nbsp;&nbsp;&nbsp;</span></li>
</ol>
</div>
<pre class="java" style="display: none" name="code">　　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;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 (Exception e) {
　　　e.printStackTrace();
　　}
　　System.out.println("运行时间：" + (System.currentTimeMillis() - lasting) + " 毫秒");
　　}
　　}
</pre>
<br />
10k消耗时间：125 62 187 94 <br />
　　100k消耗时间：704 625 640 766 <br />
　　1000k消耗时间：27984 30750 27859 30656 <br />
　　10000k消耗时间：OutOfMemoryError <br />
最后是 DOM4J http://dom4j.sourceforge.net/ <br />
<br />
　　虽然 DOM4J 代表了完全独立的开发结果，但最初，它是 JDOM 的一种智能分支。它合并了许多超出基本 XML 文档表示的功能，包括集成的 XPath 支持、XML Schema 支持以及用于大文档或流化文档的基于事件的处理。它还提供了构建文档表示的选项，它通过 DOM4J API 和标准 DOM 接口具有并行访问功能。从 2000 下半年开始，它就一直处于开发之中。 <br />
<br />
　　为支持所有这些功能，DOM4J 使用接口和抽象基本类方法。DOM4J 大量使用了 API 中的 Collections 类，但是在许多情况下，它还提供一些替代方法以允许更好的性能或更直接的编码方法。直接好处是，虽然 DOM4J 付出了更复杂的 API 的代价，但是它提供了比 JDOM 大得多的灵活性。 <br />
<br />
　　在添加灵活性、XPath 集成和对大文档处理的目标时，DOM4J 的目标与 JDOM 是一样的：针对 Java 开发者的易用性和直观操作。它还致力于成为比 JDOM 更完整的解决方案，实现在本质上处理所有 Java/XML 问题的目标。在完成该目标时，它比 JDOM 更少强调防止不正确的应用程序行为。 <br />
<br />
　　DOM4J 是一个非常非常优秀的Java XML API，具有性能优异、功能强大和极端易用使用的特点，同时它也是一个开放源代码的软件。如今你可以看到越来越多的 Java 软件都在使用 DOM4J 来读写 XML，特别值得一提的是连 Sun 的 JAXM 也在用 DOM4J。 <br />
<br />
　　Bean文件： <br />
<div class="dp-highlighter">
<div class="bar">
<div class="tools">Java代码 <a title="复制代码" onclick="dp.sh.Toolbar.CopyToClipboard(this);return false;" href="http://aronlulu.javaeye.com/blog/316917#"><img alt="复制代码" src="http://aronlulu.javaeye.com/images/icon_copy.gif" /></a></div>
</div>
<ol class="dp-j">
    <li><span><span>　　</span><span class="keyword">package</span><span>&nbsp;com.test;&nbsp; &nbsp;&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;</span></li>
    <li><span>　　</span><span class="keyword">import</span><span>&nbsp;java.io.*;&nbsp; &nbsp;&nbsp;</span></span></li>
    <li><span>　　</span><span class="keyword">import</span><span>&nbsp;java.util.*;&nbsp; &nbsp;&nbsp;</span></span></li>
    <li><span>　　</span><span class="keyword">import</span><span>&nbsp;org.dom4j.*;&nbsp; &nbsp;&nbsp;</span></span></li>
    <li><span>　　</span><span class="keyword">import</span><span>&nbsp;org.dom4j.io.*;&nbsp; &nbsp;&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;</span></li>
    <li><span>　　</span><span class="keyword">public</span><span>&nbsp;</span><span class="keyword">class</span><span>&nbsp;MyXMLReader&nbsp;{&nbsp; &nbsp;&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;</span></li>
    <li><span>　　</span><span class="keyword">public</span><span>&nbsp;</span><span class="keyword">static</span><span>&nbsp;</span><span class="keyword">void</span><span>&nbsp;main(String&nbsp;arge[])&nbsp;{&nbsp; &nbsp;&nbsp;</span></span></li>
    <li><span>　　</span><span class="keyword">long</span><span>&nbsp;lasting&nbsp;=&nbsp;System.currentTimeMillis();&nbsp; &nbsp;&nbsp;</span></span></li>
    <li><span>　　</span><span class="keyword">try</span><span>&nbsp;{&nbsp; &nbsp;&nbsp;</span></span></li>
    <li><span>　　　File&nbsp;f&nbsp;=&nbsp;</span><span class="keyword">new</span><span>&nbsp;File(</span><span class="string">"data_10k.xml"</span><span>);&nbsp; &nbsp;&nbsp;</span></span></li>
    <li><span>　　　SAXReader&nbsp;reader&nbsp;=&nbsp;</span><span class="keyword">new</span><span>&nbsp;SAXReader();&nbsp; &nbsp;&nbsp;</span></span></li>
    <li><span>　　　Document&nbsp;doc&nbsp;=&nbsp;reader.read(f);&nbsp; &nbsp;&nbsp;</span></li>
    <li><span>　　　Element&nbsp;root&nbsp;=&nbsp;doc.getRootElement();&nbsp; &nbsp;&nbsp;</span></li>
    <li><span>　　　Element&nbsp;foo;&nbsp; &nbsp;&nbsp;</span></li>
    <li><span>　　　</span><span class="keyword">for</span><span>&nbsp;(Iterator&nbsp;i&nbsp;=&nbsp;root.elementIterator(</span><span class="string">"VALUE"</span><span>);&nbsp;i.hasNext();)&nbsp;{&nbsp; &nbsp;&nbsp;</span></span></li>
    <li><span>　　　　foo&nbsp;=&nbsp;(Element)&nbsp;i.next();&nbsp; &nbsp;&nbsp;</span></li>
    <li><span>　　　　System.out.print(</span><span class="string">"车牌号码:"</span><span>&nbsp;+&nbsp;foo.elementText(</span><span class="string">"NO"</span><span>));&nbsp; &nbsp;&nbsp;</span></span></li>
    <li><span>　　　　System.out.println(</span><span class="string">"&nbsp;车主地址:"</span><span>&nbsp;+&nbsp;foo.elementText(</span><span class="string">"ADDR"</span><span>));&nbsp; &nbsp;&nbsp;</span></span></li>
    <li><span>　　　}&nbsp; &nbsp;&nbsp;</span></li>
    <li><span>　　}&nbsp;</span><span class="keyword">catch</span><span>&nbsp;(Exception&nbsp;e)&nbsp;{&nbsp; &nbsp;&nbsp;</span></span></li>
    <li><span>　　　e.printStackTrace();&nbsp; &nbsp;&nbsp;</span></li>
    <li><span>　　}&nbsp; &nbsp;&nbsp;</span></li>
    <li><span>　　System.out.println(</span><span class="string">"运行时间："</span><span>&nbsp;+&nbsp;(System.currentTimeMillis()&nbsp;-&nbsp;lasting)&nbsp;+&nbsp;</span><span class="string">"&nbsp;毫秒"</span><span>);&nbsp; &nbsp;&nbsp;</span></span></li>
    <li><span>　　}&nbsp; &nbsp;&nbsp;</span></li>
    <li><span>　　}&nbsp;&nbsp;&nbsp;</span></li>
</ol>
</div>
<pre class="java" style="display: none" name="code">　　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("车牌号码:" + foo.elementText("NO"));
　　　　System.out.println(" 车主地址:" + foo.elementText("ADDR"));
　　　}
　　} catch (Exception e) {
　　　e.printStackTrace();
　　}
　　System.out.println("运行时间：" + (System.currentTimeMillis() - lasting) + " 毫秒");
　　}
　　}
</pre>
<br />
10k消耗时间：109 78 109 31 <br />
　　100k消耗时间：297 359 172 312 <br />
　　1000k消耗时间：2281 2359 2344 2469 <br />
　　10000k消耗时间：20938 19922 20031 21078 <br />
<br />
JDOM 和 DOM 在性能测试时表现不佳，在测试 10M 文档时内存溢出。在小文档情况下还值得考虑使用 DOM 和 JDOM。虽然 JDOM 的开发者已经说明他们期望在正式发行版前专注性能问题，但是从性能观点来看，它确实没有值得推荐之处。另外，DOM 仍是一个非常好的选择。DOM 实现广泛应用于多种编程语言。它还是许多其它与 XML 相关的标准的基础，因为它正式获得 W3C 推荐（与基于非标准的 Java 模型相对），所以在某些类型的项目中可能也需要它（如在 JavaScript 中使用 DOM）。 <br />
<br />
　　SAX表现较好，这要依赖于它特定的解析方式。一个 SAX 检测即将到来的XML流，但并没有载入到内存（当然当XML流被读入时，会有部分文档暂时隐藏在内存中）。 <br />
<br />
　　无疑，DOM4J是这场测试的获胜者，目前许多开源项目中大量采用 DOM4J，例如大名鼎鼎的 Hibernate 也用 DOM4J 来读取 XML 配置文件。如果不考虑可移植性，那就采用DOM4J吧！
 <img src ="http://www.blogjava.net/gm_jing/aggbug/308243.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/gm_jing/" target="_blank">黎夕</a> 2010-01-05 10:44 <a href="http://www.blogjava.net/gm_jing/articles/308243.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>