作为一种项目中最常用的一种文件格式,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.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(); }
采用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则更多提供的是一种具体的实现和类。