摘 要:JDOM是XML文件的一種Java表示,它提供了一種表示文件的方法,可以方便有效地閱讀、操作和書寫文件,并致力于用 20%的精力來解決80%的問題。JDOM有一個簡單明了的API,既輕量又快速,它集成了DOM和SAX的優點,將兩種技術整合到一起,使兩者的配合更加自然和協調。本文著重論述JDOM的技術內涵、解析原理,給出了JDOM解析XML文件的關鍵代碼,為XML的相關開發設計人員提供了一種更好的參考依據。關鍵詞:JDOM; DOM; SAX; XML; Java
中圖分類號:TN011-34; TP312 文獻標識碼: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是一個開源項目,它基于樹型結構,利用純Java技術對XML文檔實現解析、生成、序列化以及多種操作。JDOM 直接為Java編程服務,它利用更為強有力的Java語言的諸多特性(方法重載、集合概念以及映射),把SAX和DOM的功能有效地結合起來[1],在使用設計上盡可能地隱藏原來使用XML過程中的復雜性。利用JDOM處理XML文檔將是一件輕松、簡單的事。
1 JDOM的解析原理
JDOM自身并沒有XML解析器,其解析XML文件時,通過SAX解析器讀取事件流,根據這些事件來建立JDOM樹[2]。同時,可以對解析器設置各種屬性,包括ErrorHandler,DTDHandler,EntityResolver和基礎SAX XMLReader支持的任何自定義特性和屬性。與DOM不同的是,樹中所有不同類型的節點都表示為具體類,而不表示為接口[3]。
JDOM沒有專門導航XML樹型結構的方法,其導航樹型結構通過Element類的getChildren()方法[4]。這種方法返回一個元素列表,包括一個元素的所有內容(說明、處理指令、文本接點和元素內容)[5]。要進行深度搜索,就要對當前元素的子元素應用getChildren()方法。
JDOM把不同的節點類型表示為10個具體類[6]。使用JDOM可以很方便地生成一個XML文件,相比DOM來說,其代碼可以得到很大的簡化[7]。但是,在導航XML樹型結構時,又比DOM復雜得多[8]。JDOM處理XML文件的流程見圖1。
圖1 JDOM處理XML流程
JDOM解析XML文件的時序圖見圖2。
圖2 JDOM解析XML文件時序圖
2 JDOM解析XML文件的關鍵代碼
JDOM解析XML文件的關鍵代碼如下:
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 結 語 JDOM與DOM主要有兩方面不同。首先,JDOM僅使用具體類而不使用接口,這在某些方面簡化了API,但是也限制了靈活性;其次,API大量使用了Collections類,簡化了那些已經熟悉這些類的Java開發者的使用[9]。 參考文獻 [1]哈羅德.Java 語言與XML處理教程:SAX,DOM,JDOM,JAXP與TrAX指南[M].北京:電子工業出版社,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.