??xml version="1.0" encoding="utf-8" standalone="yes"?>
1、sax、dom是两U对xml文q行分析的方法(没有具体的实玎ͼ只有接口Q?br>所以不是解释器Q如果光有他们,你是完成不了对xml文档的处理的?br>sax的包是org.xml.sax
dom的包是org.w3c.dom
包的名称很重要,它有助于你理解他们之间的关系?
2、jaxp是apiQ他装了sax\dom两种接口。ƈ在sax\dom的基之上Q作了一套比较简单的api以供开发h员用?br>jaxp的包是javax.xml.parsers
可以看看jaxp的源文gQ它的文件中包含了对sax或者dom的引用(importQ?br>jaxp也不是具体的实现Q他只是一套api。如果你仅仅有jaxp那是无法工作?br>Q其实jaxp只是完成对sax、dom的包装,生成了DocumentBuilderFactory\DocumentBuilder
和SAXParserFactory SAXParser。也是设计模式中的工厂模式Q他的好处就是具体的对象Q?解释器)建立由子cd成)
3、xerces解释器(L地球上最快的xml解释器)
在xerces中对jaxp中定义的SAXParser SAXParserFactory DocumentBuilder DocumentBuilderFactoryq行了承(extendsQ对应SAXParserImpl SAXParserFactoryImpl DocumentBuilderImpl DocumentBuilderFactoryImpl
q就是ؓ什么你的classpath中只要有xerces.jarQ其中包含了sax dom jaxp Q和 xercesImpl.jar可以的原因?
4、什么时候可以用别的解释?比如crimson?br>他也是和xerces一?是解释器Q很单,用crimson.jar 替代xercesImpl.jar
5、jdom和dom4j
W3C的DOM标准API隄的让人想撞墙Q于是有一帮h开发Java专用的XML API目的是ؓ了便于用,q就是jdom的由来,开发到一半的时候,另一部分人又分了出来Q他们有自己的想法,于是他们去开发dom4jQŞ成了今天q样两个APIQ至于他们之间的性能Qjdom全面惨|Qdom4j大获全胜。我觉得jdom和dom4jq当于sax/dom+jaxpQ具体的解释器可以选择?
W二Q再介绍一下,dom,sax,jdom,dom4j的技术特点:
1: DOM
DOM 是用与^台和语言无关的方式表C?XML 文的官?W3C 标准。DOM 是以层次l构l织的节Ҏ(gu)信息片断的集合。这个层ơ结构允许开发h员在树中L特定信息。分析该l构通常需要加载整个文档和构造层ơ结构,然后才能做Q何工作。由于它是基于信息层ơ的Q因?DOM 被认为是Z树或Z对象的。DOM 以及q义的基于树的处理具有几个优炏V首先,׃树在内存中是持久的,因此可以修改它以便应用程序能Ҏ(gu)据和l构作出更改。它q可以在M时候在树中上下DQ而不是像 SAX 那样是一ơ性的处理。DOM 使用h也要单得多?br> 另一斚wQ对于特别大的文,解析和加载整个文可能很慢且很耗资源,因此使用其他手段来处理这L数据会更好。这些基于事件的模型Q比?SAX?
2:SAX
q种处理的优炚w常类g媒体的优点。分析能够立卛_始,而不是等待所有的数据被处理。而且Q由于应用程序只是在d数据时检查数据,因此不需要将数据存储在内存中。这对于大型文来说是个巨大的优炏V事实上Q应用程序甚至不必解析整个文;它可以在某个条g得到满时停止解析。一般来_SAX q比它的替代?DOM 快许多?
3: 选择 DOM q是选择 SAX Q?br> 对于需要自q写代码来处理 XML 文档的开发h员来_选择 DOM q是 SAX 解析模型是一个非帔R要的设计决策?
DOM 采用建立树Şl构的方式访?XML 文Q?SAX 采用的事件模型?
DOM 解析器把 XML 文转化Z个包含其内容的树Qƈ可以Ҏ(gu)q行遍历。用 DOM 解析模型的优Ҏ(gu)~程Ҏ(gu)Q开发h员只需要调用徏树的指oQ然后利用navigation APIs讉K所需的树节点来完成Q务。可以很Ҏ(gu)的添加和修改树中的元素。然而由于?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同一个文档中的多处不同数据?
4: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 开发?br> JDOM ?DOM 主要有两斚w不同。首先,JDOM 仅用具体类而不使用接口。这在某些方面简化了 APIQ但是也限制了灵zL。第二,API 大量使用?Collections c,化了那些已经熟?zhn)q些cȝ Java 开发者的使用?br> JDOM 文声明其目的是“使用 20%Q或更少Q的_֊解决 80%Q或更多QJava/XML 问题”Q根据学习曲U假定ؓ 20%Q。JDOM 对于大多?Java/XML 应用E序来说当然是有用的Qƈ且大多数开发者发?API ?DOM Ҏ(gu)理解得多。JDOM q包括对E序行ؓ的相当广泛检查以防止用户做Q何在 XML 中无意义的事。然而,它仍需要?zhn)充分理?XML 以便做一些超出基本的工作Q或者甚至理解某些情况下的错误)。这也许是比学习 DOM ?JDOM 接口都更有意义的工作?br> JDOM 自n不包含解析器。它通常使用 SAX2 解析器来解析和验证输?XML 文Q尽它q可以将以前构造的 DOM 表示作ؓ输入Q。它包含一些{换器以将 JDOM 表示输出?SAX2 事g、DOM 模型?XML 文本文。JDOM 是在 Apache 许可证变体下发布的开放源码?
5: DOM4J http://dom4j.sourceforge.net/
虽然 DOM4J 代表了完全独立的开发结果,但最初,它是 JDOM 的一U智能分支。它合ƈ了许多超出基?XML 文表示的功能,包括集成?XPath 支持、XML Schema 支持以及用于大文或化文的基于事件的处理。它q提供了构徏文档表示的选项Q它通过 DOM4J API 和标?DOM 接口hq行讉K功能。从 2000 下半q开始,它就一直处于开发之中?br> 为支持所有这些功能,DOM4J 使用接口和抽象基本类Ҏ(gu)。DOM4J 大量使用?API 中的 Collections c,但是在许多情况下Q它q提供一些替代方法以允许更好的性能或更直接的编码方法。直接好处是Q虽?DOM4J 付出了更复杂?API 的代P但是它提供了?JDOM 大得多的灉|性?br> 在添加灵zL、XPath 集成和对大文处理的目标ӞDOM4J 的目标与 JDOM 是一LQ针?Java 开发者的易用性和直观操作。它q致力于成ؓ?JDOM 更完整的解决Ҏ(gu)Q实现在本质上处理所?Java/XML 问题的目标。在完成该目标时Q它?JDOM 更少防止不正的应用E序行ؓ?br> DOM4J 是一个非帔R怼U的Java XML APIQ具有性能优异、功能强大和极端易用使用的特点,同时它也是一个开放源代码的Y件。如今你可以看到来多?Java 软g都在使用 DOM4J 来读?XMLQ特别值得一提的是连 Sun ?JAXM 也在?DOM4J?
最后:我徏议用dom4j
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?br> SAX表现较好Q这要依赖于它特定的解析方式。一?SAX 即到来的XML,但ƈ没有载入到内存(当然当XML被dӞ会有部分文档暂时隐藏在内存中Q?br> 无疑QDOM4J是最好的Q目前许多开源项目中大量采用 DOM4JQ例如大名鼎鼎的 Hibernate 也用 DOM4J 来读?XML 配置文g。如果不考虑可移植性,那就采用DOM4J吧!
四种xml操作方式的基本用方?
Q?/span>?xml version="1.0" encoding="GB2312"?Q?/span>
Q?/span>RESULTQ?/span>
Q?/span>VALUEQ?/span>
Q?/span>NOQ?/span>苏A88888Q?/span>/NOQ?/span>
Q?/span>ADDRQ南京市新街?0?/span>Q?/span>/ADDRQ?/span>
Q?/span>/VALUEQ?/span>
Q?/span>VALUEQ?/span>
Q?/span>NOQ?/span>苏A99999Q?/span>/NOQ?/span>
Q?/span>ADDRQ南京市p?0?/span>Q?/span>/ADDRQ?/span>
Q?/span>/VALUEQ?/span>
Q?/span>/RESULTQ?/span>
1Q?/span>DOM
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;iQ?/span>nl.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();
}
2Q?/span>SAX
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?/span>" + (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?/span>" + 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);}
}
3Q?/span> JDOM
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;iQ?/span>allChildren.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();
}
}
4Q?/span>DOM4J
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();
}
)