(转载)JDOM/XPATH编程指南
JDOM/XPATH編程指南
本文分別介紹了 JDOM 和 XPATH,以及結(jié)合兩者進行 XML 編程帶來的好處。
前言
XML是一種優(yōu)秀的數(shù)據(jù)打包和數(shù)據(jù)交換的形式,在當(dāng)今XML大行于天下,如果沒有聽說過它的大名,那可真是孤陋寡聞了。用XML描述數(shù)據(jù)的優(yōu)勢顯而易見,它具有結(jié)構(gòu)簡單,便于人和機器閱讀的雙重功效,并彌補了關(guān)系型數(shù)據(jù)對客觀世界中真實數(shù)據(jù)描述能力的不足。W3C組織根據(jù)技術(shù)領(lǐng)域的需要,制定出了XML的格式規(guī)范,并相應(yīng)的建立了描述模型,簡稱DOM。各種流行的程序設(shè)計語言都紛紛根據(jù)這一模型推出了自己的XML解析器,在JAVA世界里,APACHE組織開發(fā)的XERCES應(yīng)該是流行最廣功能最為強大的XML解析器之一。但是由于W3C在設(shè)計DOM模型時,并不是針對某一種語言而設(shè)計,因此為了通用性,加入了許多繁瑣而不必要的細節(jié) ,使JAVA程序員在開發(fā)XML的應(yīng)用程序過程中感到不甚方便,因此JDOM作為一種新型的XML解析器橫空出世,它不遵循DOM模型,建立了自己獨立的一套JDOM模型(注意JDOM決不是DOM擴展,雖然名字差不多,但兩者是平行的關(guān)系),并提供功能強大使用方便的類庫,使JAVA程序員可以更為高效的開發(fā)自己的XML應(yīng)用程序,并極大的減少了代碼量,因此它很快得到了業(yè)內(nèi)的認可,如JBUILDER這樣的航空母艦級的重磅產(chǎn)品都以JDOM為XML解析引擎,足見其名不虛傳。
有了XML數(shù)據(jù)的描述標準,人們自然就會想到應(yīng)該有一種查詢語言可以在XML中查找任意節(jié)點的數(shù)據(jù),就像SQL語句可以在關(guān)系性數(shù)據(jù)庫中執(zhí)行查詢操作一樣,于是XQUERY和XPATH順應(yīng)潮流,應(yīng)運而生。由于XQUERY較為復(fù)雜,使用不甚方便,XPATH漸漸成為主流,我們只需對XPATH進行學(xué)習(xí),便可以應(yīng)付所有的查詢要求。在JDOM發(fā)布的最新的V1.0bata10版中,已經(jīng)加入了對XPATH的支持,這無疑是令開發(fā)者十分激動的。
學(xué)會JDOM和XPATH,你便不再是XML的入門者,在未來的開發(fā)生涯中,就像特種兵的多用匕首,為你披荊斬棘,助你勇往直前。閑言少敘,學(xué)習(xí)還要腳踏實地,從頭開始。
XPATH速成篇
XPATH遵循文檔對象模型(DOM)的路徑格式,由于每個XML文檔都可以看成是一棵擁有許多結(jié)點的樹,每個結(jié)點可以是以下七個類型之一:根(root)、元素(element)、屬性(attribute)、正文(text)、命名空間(namespace)、處理指令(processing instruction)和注釋(comment)。XPATH的基本語法由表達式構(gòu)成。在計算表達式的值之后產(chǎn)生一個對象,這種對象有以下四種基本類型:節(jié)點集合、布爾型、數(shù)字型和字符串型 。XPATH基本上和在文件系統(tǒng)中尋找文件類似,如果路徑是以"/"開頭的,就表明該路徑表示的是一個絕對路徑,這和在UNIX系統(tǒng)中關(guān)于文件路徑的定義是一致的。以"//"開頭則表示在文檔中的任意位置查找。
不談泛泛的理論,學(xué)習(xí)XPATH還要從實例學(xué)起最為快捷,并有助于你舉一反三。
下面的樣例XML文檔,描述了某臺電腦中硬盤的基本信息(根節(jié)點<HD>代表硬盤,<disk>標簽代表硬盤分區(qū),從它的name屬性可以看出有兩個盤符名稱為"C"和"D"的分區(qū);每個分區(qū)下都包含<capacity>,<directories><files>三個節(jié)點,分別代表了分區(qū)的空間大小、目錄數(shù)量、所含文件個數(shù)):
<?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文檔中使用位置路徑表達式來查找信息,這些表達式有很多種組成方式。
結(jié)點元素的查找是你將要碰到的最頻繁的查找方式。在上面這個XML文檔例子中,根HD包含disk結(jié)點。你可以使用路徑來查找這些結(jié)點,用正斜杠(/)來分隔子結(jié)點,返回所有與模式相匹配的元素。下面的XPATH 語句返回所有的disk元素:
/HD/disk
"*"代表"全部"的意思。/HD/* 代表HD下的全部節(jié)點。
下面的XPATH將返回任意節(jié)點下的名稱為disk的全部節(jié)點:
//disk
下面的XPATH將返回名稱為disk,name屬性為'C'的全部節(jié)點:
/HD/disk[@name='C']
節(jié)點的附加元素,比如屬性,函數(shù)等都要用方括號擴起來,屬性前面要加上@號
下面的XPATH將返回文件個數(shù)為1580的files節(jié)點:
/HD/disk/files[text()='1580']
大家注意到上面包含一個text(),這就是XPATH的一個函數(shù),它的功能是取出當(dāng)前節(jié)點的文本。
下面的XPATH將返回文件個數(shù)為1580的分區(qū):
/HD/disk/files[text()='1580']/parent::*
最后的parent::*表示這個元素的所有的父節(jié)點的集合。
XPATH中一些有用的函數(shù):
| booleanstarts-with(string, string) | 判斷某字符串是否以另一字符串開頭 |
| booleancontains(string, string) | 判斷某字符串是否包含另一字符串 |
| stringsubstring(string, number, number) | 取子字符串 |
| numberstring-length(string) | 測字符串長度 |
| numbersum(node-set) | 求和 |
| numberfloor(number) | 求小于此數(shù)的最大整數(shù)值 |
| numberceiling(number) | 求大于此數(shù)最小整數(shù)值 |
XPATH具有豐富的表達功能,上面這些已經(jīng)基本夠用,在你做項目中就會發(fā)現(xiàn)根據(jù)實際情況有許多查詢需求,你應(yīng)該參考本文最后提供的W3C發(fā)布的關(guān)于XAPH的官方資料進行查閱,我在這里只起一個拋磚引玉的作用,在下面的章節(jié)中,我們的應(yīng)用范例將不會超出上面提到的這些內(nèi)容,如果你對XPATH感興趣,應(yīng)該在讀完本文后,查找相關(guān)資料和書籍進行深入學(xué)習(xí)。
JDOM修煉篇
用過XERCES的程序員都會感到,有時候用一句話就可以說清楚的事,當(dāng)用XERCES的API來實現(xiàn)時,要三四行程序。
獲得并安裝JDOM
在?http://www.jdom.org/可以下載JDOM的最新版本,將壓縮包中的jdom.jar及l(fā)ib目錄下的全部jar包加入到classpath就可以了。
用JDOM解析XML
JDOM模型的全部類都在org.jdom.*這個包里,org.jdom.input.*這個包里包含了JDOM的解析器,其中的DOMBuilder的功能是將DOM模型的Document解析成JDOM模型的Document;SAXBuilder的功能是從文件或流中解析出符合JDOM模型的XML樹。由于我們的上面提到的XML樣例存儲在一個名稱為sample.xml的文件中,很顯然我們應(yīng)該采用后者作為解析工具。下面程序演示了jdom的基本功能,即解析一個xml文檔,并挑選一些內(nèi)容輸出到屏幕上。
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("分區(qū)盤符:"+name);System.out.println("分區(qū)容量:"+capacity);System.out.println("目錄數(shù):"+directories);System.out.println("文件數(shù):"+files);System.out.println("-----------------------------------");} } }程序的輸出結(jié)果:
磁盤信息: 分區(qū)盤符:C 分區(qū)容量:8G 目錄數(shù):200 文件數(shù):1580 ----------------------------------- 磁盤信息: 分區(qū)盤符:D 分區(qū)容量:10G 目錄數(shù):500 文件數(shù):3000 -----------------------------------這段程序采用了傳統(tǒng)的解析方式,一級一級的從根節(jié)點到子節(jié)點逐個采集我們所需要的數(shù)據(jù),中規(guī)中矩。試想如果這個樹足夠深,我們想取第5 0層第三個節(jié)點的數(shù)據(jù)(夸張了點,呵呵),那將是一場噩夢!下面的內(nèi)容將輕松化解你的這一痛苦。
JDOM+XPATH進階篇
說了那么多JDOM和XPATH的好處,終于到了英雄有用武之地的時候了。
JDOM的關(guān)于XPATH的api在org.jdom.xpath這個包里。看看這個包下,只有一個類,JDOM就是如此簡潔,什么事都不故弄玄虛的搞得那么復(fù)雜。這個類中的核心的api主要是兩個selectNodes()和selectSingleNode()。前者根據(jù)一個xpath語句返回一組節(jié)點;后者根據(jù)一個xpath語句返回符合條件的第一個節(jié)點。
下面的程序我們用JDOM+XPATH實現(xiàn)了上一個程序同樣的功能,你可以從中學(xué)到不少運用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("分區(qū)盤符:" + name);System.out.println("分區(qū)容量:" + capacity);System.out.println("目錄數(shù):" + directories);System.out.println("文件數(shù):" + files);System.out.println("-----------------------------------");}} }輸出結(jié)果:
磁盤信息: 分區(qū)盤符:C 分區(qū)容量:8G 目錄數(shù):200 文件數(shù):1580 ----------------------------------- 磁盤信息: 分區(qū)盤符:D 分區(qū)容量:10G 目錄數(shù):500 文件數(shù):3000 -----------------------------------結(jié)語
技術(shù)在日新月異的發(fā)展。永遠沒有學(xué)過后,便可以一勞永逸的技術(shù)。XML的發(fā)展一日千里。W3C作為INTERNET方面的權(quán)威組織指導(dǎo)著互聯(lián)網(wǎng)技術(shù)的發(fā)展方向。新技術(shù)的出現(xiàn)大都圍繞著W3C制訂的標準,但往往有些“旁門左道”的另類功法卻能產(chǎn)生驚人的殺傷力。JDOM就是這眾多旁門中的一朵奇葩。就像J2EE大行其道的今天,有許多開源組織仍舊在默默的打造著自己的獨家兵器,誰又能說在不久的將來,他們不會成為劃時代的創(chuàng)造呢? 君不見Hibernate的興起正在有力的震撼著J2EE中EJB架構(gòu)的基石。只要是成型的框架,必然有薄弱的軟肋。新的技術(shù)只要能攻入對方這一弱點,便可在業(yè)界站一席之地。本文只起拋磚引玉的作用,相信讀者在吃過這道快餐之后,一定會發(fā)現(xiàn)窗外有更美麗的風(fēng)景等待我們?nèi)ビ螝v。
轉(zhuǎn)載自:https://www.ibm.com/developerworks/cn/xml/x-jdom/
參考資料
- W3C發(fā)布的關(guān)于XPATH的權(quán)威文檔請訪問?http://www.w3.org/TR/2002/WD-DOM-Level-3-XPath-20020328
- JDOM官方網(wǎng)站可以下載最新JDOM類庫?http://www.jdom.org
轉(zhuǎn)載于:https://www.cnblogs.com/ysw-go/p/5417417.html
總結(jié)
以上是生活随笔為你收集整理的(转载)JDOM/XPATH编程指南的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: mysql添加外键
- 下一篇: 利用yii2 gridview实现批量删