测试环境:
AMD毒龙1.4G OC 1.5G、256M DDR333、Windows2000 Server SP4、Sun JDK 1.4.1 Eclipse 2.1 Resin 2.1.8,在Debug模式下测试。
XML文件格局如下:
以下为引用的内容:
测试方法:
让每一种计划分辨解析10K、100K、1000K、10000K的XML文件,盘算其耗费时间(单位:毫秒)。
以下为引用的内容:
JSP文件:
<%@ page cOntentType="text/html; charset=gb2312" %><%@ page import="com.test.*"%>
<%String args[]={""};MyXMLReader.main(args);%>
测试
首先出场的是DOM(JAXP Crimson解析器)
DOM是用与平台和语言无关的方法表现XML文档的官方W3C尺度。DOM是以层次结构组织的节点或信息片段的聚集。这个层次结构答应开发职员在树中寻找特定信息。分析该结构通常需要加载全部文档和结构层次结构,然后才干做任何工作。由于它是基于信息层次的,因而DOM被认为是基于树或基于对象的。DOM以及广义的基于树的处理具有几个长处。首先,由于树在内存中是持久的,因此可以修正它以便利用程序能对数据和结构作出更改。它还可以在任何时候在树中高低导航,而不是像SAX那样是一次性的处理。DOM应用起来也要简略得多。
另一方面,对于特别大的文档,解析和加载全部文档可能很慢且很耗资源,因此应用其他手段来处理这样的数据会更好。这些基于事件的模型,比如SAX。
以下为引用的内容:
Bean文件:
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 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) "毫秒");}} 10k耗费时间:265 203 219 172 100k耗费时间:9172 9016 8891 9000 1000k耗费时间:691719 675407 708375 739656 10000k耗费时间:OutOfMemoryError
接着是SAX
这种处理的长处非常类似于流媒体的长处。分析能够立即开端,而不是等候所有的数据被处理。而且,由于利用程序只是在读取数据时检查数据,因此不需要将数据存储在内存中。这对于大型文档来说是个宏大的长处。事实上,利用程序甚至不必解析全部文档;它可以在某个条件得到满足时结束解析。一般来说,SAX还比它的调换者DOM快很多。
选择DOM还是选择SAX?
对于需要自己编写代码来处理XML文档的开发职员来说,选择DOM还是SAX解析模型是一个非常重要的设计决策。
DOM采用建立树形结构的方法拜访XML文档,而SAX采用的事件模型。
DOM解析器把XML文档转化为一个包含其内容的树,并可以对树进行遍历。用DOM解析模型的长处是编程轻易,开发职员只需要调用建树的指令,然后利用navigation APIs拜访所需的树节点来完成任务。可以很轻易的添加和修正树中的元素。然而由于应用DOM解析器的时候需要处理全部XML文档,所以对性能和内存的请求比拟高,尤其是碰到很大的XML文件的时候。由于它的遍历才能,DOM解析器常用于XML文档需要频繁的转变的服务中。
SAX解析器采用了基于事件的模型,它在解析XML文档的时候可以触发一系列的事件,当发明给定的tag的时候,它可以激活一个回调方法,告诉该方法制定的标签已经找到。SAX对内存的请求通常会比拟低,由于它让开发职员自己来决定所要处理的tag。特别是当开发职员只需要处理文档中所包含的部分数据时,SAX这种扩大才能得到了更好的体现。但用SAX解析器的时候编码工作会比拟艰苦,而且很难同时拜访同一个文档中的多处不同数据。
以下为引用的内容:
Bean文件:
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);}}
10k耗费时间:110 47 109 78
100k耗费时间:344 406 375 422
1000k耗费时间:3234 3281 3688 3312