JDOM / XPATH編程指南

來源:互聯網
上載者:User
JDOM/XPATH編程指南

文檔選項

<tr valign="top"><td width="8"><img alt="" height="1" width="8" src="//www.ibm.com/i/c.gif"/></td><td width="16"><img alt="" width="16" height="16" src="//www.ibm.com/i/c.gif"/></td><td class="small" width="122"><p><span class="ast">未顯示需要 JavaScript 的文檔選項</span></p></td></tr>


將此頁作為電子郵件發送

層級: 初級

薛穀雨 (rainight@126.com), 進階JAVA工程師, NORDSAN資訊科技開發有限公司

2004 年 5 月 01 日

本文分別介紹了 JDOM 和 XPATH,以及結合兩者進行 XML 編程帶來的好處。

前言

XML 是一種優秀的資料打包和資料交換的形式,在當今XML大行於天下,如果沒有聽說過它的大名,那可真是孤陋寡聞了。用XML描述資料的優勢顯而易見,它具有 結構簡單,便於人和機器閱讀的雙重功效,並彌補了關係型資料對客觀世界中真實資料描述能力的不足。W3C組織根據技術領域的需要,制定出了XML的格式規 範,並相應的建立了描述模型,簡稱DOM。各種流行的程式設計語言都紛紛根據這一模型推出了自己的XML解析器,在JAVA世界裡,APACHE組織開發 的XERCES應該是流行最廣功能最為強大的XML解析器之一。但是由於W3C在設計DOM模型時,並不是針對某一種語言而設計,因此為了通用性,加入了 許多繁瑣而不必要的細節 ,使JAVA程式員在開發XML的應用程式過程中感到不甚方便,因此JDOM作為一種新型的XML解析器橫空出世,它不遵循DOM模型,建立了自己獨立的 一套JDOM模型(注意JDOM決不是DOM擴充,雖然名字差不多,但兩者是平行的關係),並提供功能強大使用方便的類庫,使JAVA程式員可以更為高效 的開發自己的XML應用程式,並極大的減少了代碼量,因此它很快得到了業內的認可,如JBUILDER這樣的航空母艦級的重磅產品都以JDOM為XML解 析引擎,足見其名不虛傳。

有了XML資料的描述標準,人們自然就會想到應該有一種查詢語言可以在XML中尋找任意節點的數 據,就像SQL語句可以在關係性資料庫中執行查詢操作一樣,於是XQUERY和XPATH順應潮流,應運而生。由於XQUERY較為複雜,使用不甚方便, XPATH漸漸成為主流,我們只需對XPATH進行學習,便可以應付所有的查詢要求。在JDOM發布的最新的V1.0bata10版中,已經加入了對 XPATH的支援,這無疑是令開發人員十分激動的。

學會JDOM和XPATH,你便不再是XML的入門者,在未來的開發生涯中,就像特種兵的多用匕首,為你披荊斬棘,助你勇往直前。閑言少敘,學習還要腳踏實地,從頭開始。



回頁首

XPATH速成篇

XPATH 遵循文件物件模型(DOM)的路徑格式,由於每個XML文檔都可以看成是一棵擁有許多結點的樹,每個結點可以是以下七個類型之一:根(root)、元素 (element)、屬性(attribute)、本文(text)、命名空間(namespace)、處理指示(processing instruction)和注釋(comment)。XPATH的基本文法由運算式構成。在計算運算式的值之後產生一個對象,這種對象有以下四種基本類 型:節點集合、布爾型、數字型和字串型 。XPATH基本上和在檔案系統中尋找檔案類似,如果路徑是以"/"開頭的,就表明該路徑表示的是一個絕對路徑,這和在UNIX系統中關於檔案路徑的定義 是一致的。以"//"開頭則表示在文檔中的任意位置尋找。

不談泛泛的理論,學習XPATH還要從執行個體學起最為快捷,並有助於你舉一反三。

下 面的範例XML文檔,描述了某台電腦中硬碟的基本資料(根節點<HD>代表硬碟,<disk>標籤代表硬碟分區,從它的name 屬性可以看出有兩個盤符名稱為"C"和"D"的分區;每個分區下都包含<capacity>,<directories> <files>三個節點,分別代表了分區的空間大小、目錄數量、所含檔案個數):

<?xml version="1.0" encoding="UTF-8"?>
<HD>
<disk name="C">
<capacity>8G</capacity>
<directories>200</directories>
<files>1580</files>
</disk>
<disk name="D">
<capacity>10G</capacity>
<directories>500</directories>
<files>3000</files>
</disk>
</HD>

你在XML文檔中使用位置路徑運算式來尋找資訊,這些運算式有很多種組成方式。

結點元素的尋找是你將要碰到的最頻繁的尋找方式。在上面這個XML文檔例子中,根HD包含disk結點。你可以使用路徑來尋找這些結點,用正斜杠(/)來分隔子結點,返回所有與模式相匹配的元素。下面的XPATH 語句返回所有的disk元素:

/HD/disk

"*"代表"全部"的意思。/HD/* 代表HD下的全部節點。

下面的XPATH將返回任意節點下的名稱為disk的全部節點:

//disk

下面的XPATH將返回名稱為disk,name屬性為'C'的全部節點:

/HD/disk[@name='C']

節點的附加元素,比如屬性,函數等都要用方括弧擴起來,屬性前面要加上@號

下面的XPATH將返迴文件個數為1580的files節點:

/HD/disk/files[text()='1580']

大家注意到上麵包含一個text(),這就是XPATH的一個函數,它的功能是取出當前節點的文本。

下面的XPATH將返迴文件個數為1580的分區:

/HD/disk/files[text()='1580']/parent::*

最後的parent::*表示這個元素的所有的父節點的集合。

XPATH中一些有用的函數:

string concat (string, string, string*) 聯結兩個字串
boolean starts-with (string, string) 判斷某字串是否以另一字串開頭
boolean contains (string, string) 判斷某字串是否包含另一字串
string substring (string, number, number) 取子字串
number string-length (string) 測字串長度
number sum (node-set) 求和
number floor (number) 求小於此數的最大整數值
number ceiling (number) 求大於此數最小整數值

XPATH 具有豐富的表達功能,上面這些已經基本夠用,在你做項目中就會發現根據實際情況有許多查詢需求,你應該參考本文最後提供的W3C發布的關於XAPH的官方 資料進行查閱,我在這裡只起一個拋磚引玉的作用,在下面的章節中,我們的應用範例將不會超出上面提到的這些內容,如果你對XPATH感興趣,應該在讀完本 文後,尋找相關資料和書籍進行深入學習。



回頁首

JDOM修鍊篇

用過XERCES的程式員都會感到,有時候用一句話就可以說清楚的事,當用XERCES的API來實現時,要三四行程式。



回頁首

獲得並安裝JDOM

在 http://www.jdom.org/可以下載JDOM的最新版本,將壓縮包中的jdom.jar及lib目錄下的全部jar包加入到classpath就可以了。



回頁首

用JDOM解析XML

JDOM 模型的全部類都在org.jdom.*這個包裡,org.jdom.input.*這個包裡包含了JDOM的解析器,其中的DOMBuilder的功能是 將DOM模型的Document解析成JDOM模型的Document;SAXBuilder的功能是從檔案或流中解析出符合JDOM模型的XML樹。由 於我們的上面提到的XML範例儲存在一個名稱為sample.xml的檔案中,很顯然我們應該採用後者作為解析工具。下面程式示範了jdom的準系統, 即解析一個xml文檔,並挑選一些內容輸出到螢幕上。

import java.util.*;
import org.jdom.*;
import org.jdom.input.SAXBuilder;
public class Sample1 {
public static void main(String[] args) throws Exception{
SAXBuilder sb=new SAXBuilder();
Document doc=sb.build("sample.xml");
Element root=doc.getRootElement();
List list=root.getChildren("disk");
for(int i=0;i<list.size();i++){
Element element=(Element)list.get(i);
String name=element.getAttributeValue("name");
String capacity=element.getChildText("capacity");
String directories=element.getChildText("directories");
String files=element.getChildText("files");
System.out.println("磁碟資訊:");
System.out.println("分區盤符:"+name);
System.out.println("分區容量:"+capacity);
System.out.println("目錄數:"+directories);
System.out.println("檔案數:"+files);
System.out.println("-----------------------------------");
}
}
}

程式的輸出結果:

磁碟資訊:
分區盤符:C
分區容量:8G
目錄數:200
檔案數:1580
-----------------------------------
磁碟資訊:
分區盤符:D
分區容量:10G
目錄數:500
檔案數:3000
-----------------------------------

這段程式採用了傳統的解析方式,一級一級的從根節點到子節點逐個採集我們所需要的資料,中規中矩。試想如果這個樹足夠深,我們想取第5 0層第三個節點的資料(誇張了點,呵呵),那將是一場噩夢!下面的內容將輕鬆化解你的這一痛苦。



回頁首

JDOM+XPATH進階篇

說了那麼多JDOM和XPATH的好處,終於到了英雄有用武之地的時候了。

JDOM 的關於XPATH的api在org.jdom.xpath這個包裡。看看這個包下,只有一個類,JDOM就是如此簡潔,什麼事都不故弄玄虛的搞得那麼複 雜。這個類中的核心的api主要是兩個selectNodes()和selectSingleNode()。前者根據一個xpath語句返回一組節點;後 者根據一個xpath語句返回合格第一個節點。

下面的程式我們用JDOM+XPATH實現了上一個程式同樣的功能,你可以從中學到不少運用XPATH 的知識:

import java.util.*;
import org.jdom.*;
import org.jdom.input.SAXBuilder;
import org.jdom.xpath.XPath;
public class Sample2 {
public static void main(String[] args) throws Exception {
SAXBuilder sb = new SAXBuilder();
Document doc = sb.build("sample.xml");
Element root = doc.getRootElement();
List list = XPath.selectNodes(root, "/HD/disk");
for (int i = 0; i > list.size(); i++) {
Element disk_element = (Element) list.get(i);
String name = disk_element.getAttributeValue("name");
String capacity = ( (Text) XPath.selectSingleNode(disk_element,
"//disk[@name='" + name + "']/capacity/text()")).getTextNormalize();
String directories = ( (Text) XPath.selectSingleNode(disk_element,
"//disk[@name='" + name + "']/directories/text()")).getTextNormalize();
String files = ( (Text) XPath.selectSingleNode(disk_element,
"//disk[@name='" + name + "']/files/text()")).getTextNormalize();
System.out.println("磁碟資訊:");
System.out.println("分區盤符:" + name);
System.out.println("分區容量:" + capacity);
System.out.println("目錄數:" + directories);
System.out.println("檔案數:" + files);
System.out.println("-----------------------------------");
}
}
}

輸出結果:

磁碟資訊:
分區盤符:C
分區容量:8G
目錄數:200
檔案數:1580
-----------------------------------
磁碟資訊:
分區盤符:D
分區容量:10G
目錄數:500
檔案數:3000
-----------------------------------


回頁首

結語

技 術在日新月異的發展。永遠沒有學過後,便可以一勞永逸的技術。XML的發展一日千裡。W3C作為INTERNET方面的權威組織指導著互連網技術的發展方 向。新技術的出現大都圍繞著W3C制訂的標準,但往往有些“旁門左道”的另類功法卻能產生驚人的殺傷力。JDOM就是這眾多旁門中的一朵奇葩。就像 J2EE大行其道的今天,有許多開源組織仍舊在默默的打造著自己的獨家兵器,誰又能說在不久的將來,他們不會成為劃時代的創造呢? 君不見Hibernate的興起正在有力的震撼著J2EE中EJB架構的基石。只要是成型的架構,必然有薄弱的軟肋。新的技術只要能攻入對方這一弱點,便 可在業界站一席之地。本文只起拋磚引玉的作用,相信讀者在吃過這道快餐之後,一定會發現窗外有更美麗的風景等待我們去遊歷。

參考資料

  • W3C發布的關於XPATH的權威文檔請訪問 http://www.w3.org/TR/2002/WD-DOM-Level-3-XPath-20020328

  • JDOM官方網站可以下載最新JDOM類庫 http://www.jdom.org

關於作者

 

薛穀雨是NORDSAN(北京)資訊科技開發有限公司進階JAVA研發工程師,正致力於企業級異構資料交換的伺服器產品的研發,在J2EE和WEB SERVICE方面有較為豐富的開發經驗,你可以通過 rainight@126.com與他取得聯絡。

 

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.