作为一种项目中最常用的一种文件格式,XML的重要性不言而喻。而对XML的解析也就成为了一个很具有意义的知识点,这里分享一下解析XML的三种方式——DOM,Dom4j,JDom。
1、DOM
DOM 是用与平台和语言无关的方式表示 XML 文档的官方 W3C 标准。DOM是以层次结构组织的节点或信息片断的集合。这个层次结构允许开发人员在树中寻找特定信息。分析该结构通常需要加载整个文档和构造层次结构,然后才能做任何工作。由于它是基于信息层次的,因而DOM 被认为是基于树或基于对象的。DOM 以及广义的基于树的处理具有几个优点。
2、JDOM
JDOM的目的是成为 Java 特定文档模型,它简化与 XML 的交互并且比使用 DOM 实现更快。由于是第一个 Java 特定模型,JDOM 一直得到大力推广和促进。JDOM 与 DOM 主要有两方面不同。
a)JDOM 仅使用具体类而不使用接口。这在某些方面简化了 API,但是也限制了灵活性。
b)API 大量使用了 Collections 类,简化了那些已经熟悉这些类的 Java 开发者的使用。
3、Dom4j
Dom4J,这个在DRP中介绍并使用的,对于学过DRP的显然很熟悉了。Dom4J 使用了大量的接口和抽象基本类方法。Dom4J大量使用了 API 中的 Collections 类,但是在许多情况下,它还提供一些替代方法以允许更好的性能或更直接的编码方法。直接好处是,虽然Dom4J付出了更复杂的 API 的代价,但是它提供了比 JDom大得多的灵活性。
(附)SAX
SAX处理的优点非常类似于流媒体的优点。分析能够立即开始,而不是等待所有的数据被处理。而且,由于应用程序只是在读取数据时检查数据,因此不需要将数据存储在内存中。这对于大型文档来说是个巨大的优点。事实上,应用程序甚至不必解析整个文档;它可以在某个条件得到满足时停止解析。一般来说,SAX 还比它的替代者 DOM 快许多。说白了,SAX更适合大型文档的解析。
具体实例:
XML文件:
- <span style="font-family:KaiTi_GB2312;font-size:18px;"><?xml version="1.0" encoding="GB2312"?>
- <RESULT>
- <VALUE>
- <NO>A1234</NO>
- <ADDR>XX号</ADDR>
- </VALUE>
- <VALUE>
- <NO>B1234</NO>
- <ADDR>XX组</ADDR>
- </VALUE>
- </RESULT></span>
采用dom解析
- <span style="font-size:18px;">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();
- } </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;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();
- }
- }
采用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("车牌号码:" + foo.elementText("NO"));
- System.out.println("车主地址:" + foo.elementText("ADDR"));
- }
- } catch (Exception e) {
- e.printStackTrace();
- }
- )
小结:
1)、dom是解析XML的最基础的底层接口,SAX是另一种;
2)、dom4j和Jdom都是基于dom的再封装,两者是专门针对java而进行实现的;
3)、dom4j和Jdom两者封装的程度不尽相同,这也是导致两者差异性的原因。其中dom4j之所以比Jdom更广泛的得到试用,是因为dom4j更多的接口和抽象类,这样虽然比Jdom复杂,但是提供了更大的灵活性,符合我们“面向接口编程的思想”,而Jdom则更多提供的是一种具体的实现和类。