摘 要:JDOM是XML文件的一種Java表示,它提供了一種表示文件的方法,可以方便有效地閱讀、操作和書寫文件,并致力于用 20%的精力來解決80%的問題。JDOM有一個簡單明了的API,既輕量又快速,它集成了DOM和SAX的優(yōu)點(diǎn),將兩種技術(shù)整合到一起,使兩者的配合更加自然和協(xié)調(diào)。本文著重論述JDOM的技術(shù)內(nèi)涵、解析原理,給出了JDOM解析XML文件的關(guān)鍵代碼,為XML的相關(guān)開發(fā)設(shè)計人員提供了一種更好的參考依據(jù)。關(guān)鍵詞:JDOM; DOM; SAX; XML; Java
中圖分類號:TN011-34; TP312 文獻(xiàn)標(biāo)識碼:A
文章編號:1004-373X(2010)22-0040-02
XML Data Analysis Technique Based on JDOM
LIU Yu-xiao1, YANG Ya-juan2
(1. Xiangfan University, Xiangfan 441001, China; 2. Northwest Civil Aviation Air Traffic Management Bureau, Xi’an 710082, China)
Abstract: JDOM is a kind of Java in XML document, which provided a way to express document in order to read,operate and write conveniently. JDOM has a simple API, which is slight and fast. API collected the merits of DOM and SAX so that both can work in a coordinate and natural way. The technical and the analysis principle of JDOM, and the key code about XML document are analyzed. A better reference is provided for the XML related development designers.Keywords:JDOM; DOM; SAX; XML; Java
0 引 言
JDOM是一個開源項目,它基于樹型結(jié)構(gòu),利用純Java技術(shù)對XML文檔實現(xiàn)解析、生成、序列化以及多種操作。JDOM 直接為Java編程服務(wù),它利用更為強(qiáng)有力的Java語言的諸多特性(方法重載、集合概念以及映射),把SAX和DOM的功能有效地結(jié)合起來[1],在使用設(shè)計上盡可能地隱藏原來使用XML過程中的復(fù)雜性。利用JDOM處理XML文檔將是一件輕松、簡單的事。
1 JDOM的解析原理
JDOM自身并沒有XML解析器,其解析XML文件時,通過SAX解析器讀取事件流,根據(jù)這些事件來建立JDOM樹[2]。同時,可以對解析器設(shè)置各種屬性,包括ErrorHandler,DTDHandler,EntityResolver和基礎(chǔ)SAX XMLReader支持的任何自定義特性和屬性。與DOM不同的是,樹中所有不同類型的節(jié)點(diǎn)都表示為具體類,而不表示為接口[3]。
JDOM沒有專門導(dǎo)航XML樹型結(jié)構(gòu)的方法,其導(dǎo)航樹型結(jié)構(gòu)通過Element類的getChildren()方法[4]。這種方法返回一個元素列表,包括一個元素的所有內(nèi)容(說明、處理指令、文本接點(diǎn)和元素內(nèi)容)[5]。要進(jìn)行深度搜索,就要對當(dāng)前元素的子元素應(yīng)用getChildren()方法。
JDOM把不同的節(jié)點(diǎn)類型表示為10個具體類[6]。使用JDOM可以很方便地生成一個XML文件,相比DOM來說,其代碼可以得到很大的簡化[7]。但是,在導(dǎo)航XML樹型結(jié)構(gòu)時,又比DOM復(fù)雜得多[8]。JDOM處理XML文件的流程見圖1。
圖1 JDOM處理XML流程
JDOM解析XML文件的時序圖見圖2。
圖2 JDOM解析XML文件時序圖
2 JDOM解析XML文件的關(guān)鍵代碼
JDOM解析XML文件的關(guān)鍵代碼如下:
import java.io.*;
import java.util.*;
import org.jdom.*;
import org.jdom.input.*;
public class JDOMReader {
public static void main(String args[ ]) {
try {
SAXBuilder builder = new SAXBuilder();
Document doc = builder.build(new File(\"XXX.xml\"));
Element foo = doc.getRootElement();
List allChildren = foo.getChildren();
for(int i=0;i Sytem.out.println(((Element)allChildren.get(i)). getChild().getAttribute()); Sytem.out.println(((Element)allChildren.get(i)). getChild().getText()); } } catch (Exception e) { e.printStackTrace(); } } } 3 結(jié) 語 JDOM與DOM主要有兩方面不同。首先,JDOM僅使用具體類而不使用接口,這在某些方面簡化了API,但是也限制了靈活性;其次,API大量使用了Collections類,簡化了那些已經(jīng)熟悉這些類的Java開發(fā)者的使用[9]。 參考文獻(xiàn) [1]哈羅德.Java 語言與XML處理教程:SAX,DOM,JDOM,JAXP與TrAX指南[M].北京:電子工業(yè)出版社,2003. [2]W3C. W3C document object model (DOM)[R/OL].[2005-11-07].http://xml.coverpages.org/dom.html. [3]JDOM. JDOM V1.0 API specification[R/OL].[2005-06-17].http://www.jdom.org/docs/apidocs/. [4]Saxproject. SAX 2.0 extensions[R/OL].[2005-06-07].http://www.saxproject.org/about.html. [5]BIGGS Wes, EVANS Harry. Simplify XML programming with JDOM[J/OL].[2005-06-18].http://www-128.ibm.com/ developerworks/library/j-jdom/index.htm. [6]HUNTER Jason. JDOM and XML parsing[J/OL]. Part 1.[2005-06-23].http://www.oracle.com/technology/oramag/oracle/ 02-sep/o52jdom.html. [7]MERTZ David. XML matters: the XOM Java XML API[J/OL].[2005-07-01].http://www-128.ibm.com/developerworks/ library/ x-matters32.html. [8]DOM4J. XML API for Java comparison[EB/OL].[2005-07-07].http://www.dom4j.org/compare.html. [9]SOSNOSKI Dennis M. Java中的XML: 文檔模型,第一部分:性能[J/OL]. [2005-07-09].http://www-128.ibm.com/ developerworks/cn/xml/x-injava.