国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 學(xué)院 > 開發(fā)設(shè)計(jì) > 正文

JDOM / XPATH 編程入門引導(dǎo)攻略

2019-11-18 12:53:05
字體:
供稿:網(wǎng)友

  前言
  xml是一種優(yōu)秀的數(shù)據(jù)打包和數(shù)據(jù)交換的形式,在當(dāng)今XML大行于天下,假如沒有聽說過它的大名,那可真是孤陋寡聞了。用XML描述數(shù)據(jù)的優(yōu)勢顯而易見,它具有結(jié)構(gòu)簡單,便于人和機(jī)器閱讀的雙重功效,并彌補(bǔ)了關(guān)系型數(shù)據(jù)對客觀世界中真實(shí)數(shù)據(jù)描述能力的不足。W3C組織根據(jù)技術(shù)領(lǐng)域的需要,制定出了XML的格式規(guī)范,并相應(yīng)的建立了描述模型,簡稱DOM。各種流行的程序設(shè)計(jì)語言都紛紛根據(jù)這一模型推出了自己的XML解析器,在java世界里,APACHE組織開發(fā)的XERCES應(yīng)該是流行最廣功能最為強(qiáng)大的XML解析器之一。但是由于W3C在設(shè)計(jì)DOM模型時(shí),并不是針對某一種語言而設(shè)計(jì),因此為了通用性,加入了許多繁瑣而不必要的細(xì)節(jié) ,使JAVA程序員在開發(fā)XML的應(yīng)用程序過程中感到不甚方便,因此JDOM作為一種新型的XML解析器橫空出世,它不遵循DOM模型,建立了自己獨(dú)立的一套JDOM模型(注重JDOM決不是DOM擴(kuò)展,雖然名字差不多,但兩者是平行的關(guān)系),并提供功能強(qiáng)大使用方便的類庫,使JAVA程序員可以更為高效的開發(fā)自己的XML應(yīng)用程序,并極大的減少了代碼量,因此它很快得到了業(yè)內(nèi)的認(rèn)可,如JBUILDER這樣的航空母艦級(jí)的重磅產(chǎn)品都以JDOM為XML解析引擎,足見其名不虛傳。
  
  有了XML數(shù)據(jù)的描述標(biāo)準(zhǔn),人們自然就會(huì)想到應(yīng)該有一種查詢語言可以在XML中查找任意節(jié)點(diǎn)的數(shù)據(jù),就像SQL語句可以在關(guān)系性數(shù)據(jù)庫中執(zhí)行查詢操作一樣,于是XQUERY和XPATH順應(yīng)潮流,應(yīng)運(yùn)而生。由于XQUERY較為復(fù)雜,使用不甚方便,XPATH漸漸成為主流,我們只需對XPATH進(jìn)行學(xué)習(xí),便可以應(yīng)付所有的查詢要求。在JDOM發(fā)布的最新的V1.0bata10版中,已經(jīng)加入了對XPATH的支持,這無疑是令開發(fā)者十分激動(dòng)的。
  
  學(xué)會(huì)JDOM和XPATH,你便不再是XML的入門者,在未來的開發(fā)生涯中,就像特種兵的多用匕首,為你披荊斬棘,助你勇往直前。閑言少敘,學(xué)習(xí)還要腳踏實(shí)地,從頭開始。
  
  XPATH速成篇
  XPATH遵循文檔對象模型(DOM)的路徑格式,由于每個(gè)XML文檔都可以看成是一棵擁有許多結(jié)點(diǎn)的樹,每個(gè)結(jié)點(diǎn)可以是以下七個(gè)類型之一:根(root)、元素(element)、屬性(attribute)、正文(text)、命名空間(namespace)、處理指令(PRocessing instrUCtion)和注釋(comment)。XPATH的基本語法由表達(dá)式構(gòu)成。在計(jì)算表達(dá)式的值之后產(chǎn)生一個(gè)對象,這種對象有以下四種基本類型:節(jié)點(diǎn)集合、布爾型、數(shù)字型和字符串型 。XPATH基本上和在文件系統(tǒng)中尋找文件類似,假如路徑是以"/"開頭的,就表明該路徑表示的是一個(gè)絕對路徑,這和在UNIX系統(tǒng)中關(guān)于文件路徑的定義是一致的。以"http://"開頭則表示在文檔中的任意位置查找。
  
  不談泛泛的理論,學(xué)習(xí)XPATH還要從實(shí)例學(xué)起最為快捷,并有助于你舉一反三。
  
  下面的樣例XML文檔,描述了某臺(tái)電腦中硬盤的基本信息(根節(jié)點(diǎn)< HD>代表硬盤,< disk>標(biāo)簽代表硬盤分區(qū),從它的name屬性可以看出有兩個(gè)盤符名稱為"C"和"D"的分區(qū);每個(gè)分區(qū)下都包含< capacity>,< Directories>< files>三個(gè)節(jié)點(diǎn),分別代表了分區(qū)的空間大小、目錄數(shù)量、所含文件個(gè)數(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文檔中使用位置路徑表達(dá)式來查找信息,這些表達(dá)式有很多種組成方式。
  
  結(jié)點(diǎn)元素的查找是你將要碰到的最頻繁的查找方式。在上面這個(gè)XML文檔例子中,根HD包含disk結(jié)點(diǎn)。你可以使用路徑來查找這些結(jié)點(diǎn),用正斜杠(/)來分隔子結(jié)點(diǎn),返回所有與模式相匹配的元素。下面的XPATH 語句返回所有的disk元素:
  
  /HD/disk
  
  "*"代表"全部"的意思。/HD/* 代表HD下的全部節(jié)點(diǎn)。
  
  下面的XPATH將返回任意節(jié)點(diǎn)下的名稱為disk的全部節(jié)點(diǎn):
  
  //disk
  
  下面的XPATH將返回名稱為disk,name屬性為'C'的全部節(jié)點(diǎn):
  
  /HD/disk[@name='C']
  
  節(jié)點(diǎn)的附加元素,比如屬性,函數(shù)等都要用方括號(hào)擴(kuò)起來,屬性前面要加上@號(hào)
  
  下面的XPATH將返回文件個(gè)數(shù)為1580的files節(jié)點(diǎn):
  
  /HD/disk/files[text()='1580']
  
  大家注重到上面包含一個(gè)text(),這就是XPATH的一個(gè)函數(shù),它的功能是取出當(dāng)前節(jié)點(diǎn)的文本。
  
  下面的XPATH將返回文件個(gè)數(shù)為1580的分區(qū):
  
  /HD/disk/files[text()='1580']/parent::*
  
  最后的parent::*表示這個(gè)元素的所有的父節(jié)點(diǎn)的集合。
  
  XPATH中一些有用的函數(shù):
  
JDOM / XPATH 編程入門引導(dǎo)攻略

  XPATH具有豐富的表達(dá)功能,上面這些已經(jīng)基本夠用,在你做項(xiàng)目中就會(huì)發(fā)現(xiàn)根據(jù)實(shí)際情況有許多查詢需求,你應(yīng)該參考本文最后提供的W3C發(fā)布的關(guān)于XAPH的官方資料進(jìn)行查閱,我在這里只起一個(gè)拋磚引玉的作用,在下面的章節(jié)中,我們的應(yīng)用范例將不會(huì)超出上面提到的這些內(nèi)容,假如你對XPATH感愛好,應(yīng)該在讀完本文后,查找相關(guān)資料和書籍進(jìn)行深入學(xué)習(xí)。
  
  JDOM修煉篇
  用過XERCES的程序員都會(huì)感到,有時(shí)候用一句話就可以說清楚的事,當(dāng)用XERCES的API來實(shí)現(xiàn)時(shí),要三四行程序。
  
  獲得并安裝JDOM
  在http://www.jdom.org/ 可以下載JDOM的最新版本,將壓縮包中的jdom.jar及l(fā)ib目錄下的全部jar包加入到classpath就可以了。
  
  用JDOM解析XML
  JDOM模型的全部類都在org.jdom.*這個(gè)包里,org.jdom.input.*這個(gè)包里包含了JDOM的解析器,其中的DOMBuilder的功能是將DOM模型的Document解析成JDOM模型的Document;SAXBuilder的功能是從文件或流中解析出符合JDOM模型的XML樹。由于我們的上面提到的XML樣例存儲(chǔ)在一個(gè)名稱為sample.xml的文件中,很顯然我們應(yīng)該采用后者作為解析工具。下面程序演示了jdom的基本功能,即解析一個(gè)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)的解析方式,一級(jí)一級(jí)的從根節(jié)點(diǎn)到子節(jié)點(diǎn)逐個(gè)采集我們所需要的數(shù)據(jù),中規(guī)中矩。試想假如這個(gè)樹足夠深,我們想取第5 0層第三個(gè)節(jié)點(diǎn)的數(shù)據(jù)(夸張了點(diǎn),呵呵),那將是一場噩夢!下面的內(nèi)容將輕松化解你的這一痛苦。
  
  JDOM+XPATH進(jìn)階篇
  說了那么多JDOM和XPATH的好處,終于到了英雄有用武之地的時(shí)候了。
  
  JDOM的關(guān)于XPATH的api在org.jdom.xpath這個(gè)包里。看看這個(gè)包下,只有一個(gè)類,JDOM就是如此簡潔,什么事都不故弄玄虛的搞得那么復(fù)雜。這個(gè)類中的核心的api主要是兩個(gè)selectNodes()和selectSingleNode()。前者根據(jù)一個(gè)xpath語句返回一組節(jié)點(diǎn);后者根據(jù)一個(gè)xpath語句返回符合條件的第一個(gè)節(jié)點(diǎn)。
  
  下面的程序我們用JDOM+XPATH實(shí)現(xiàn)了上一個(gè)程序同樣的功能,你可以從中學(xué)到不少運(yùn)用XPATH 的知識(shí):
  
  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_ele

發(fā)表評論 共有條評論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
主站蜘蛛池模板: 南丰县| 车险| 龙州县| 新竹市| 开平市| 大港区| 泽州县| 滕州市| 荔浦县| 南木林县| 保定市| 富平县| 大同县| 大兴区| 兴义市| 河北省| 多伦县| 毕节市| 双桥区| 荔浦县| 藁城市| 孝昌县| 昌吉市| 凭祥市| 久治县| 辛集市| 基隆市| 黎川县| 河池市| 永修县| 临朐县| 江陵县| 湛江市| 诸城市| 晋州市| 荆州市| 兴宁市| 洛川县| 甘谷县| 吉安县| 安义县|