用過XERCES的程序員都會感到,有時候用一句話就能夠說清楚的事,當用XERCES的API來實現時,要三四行程序。java
回頁首程序員
在 http://www.jdom.org/能夠下載JDOM的最新版本,將壓縮包中的jdom.jar及lib目錄下的所有jar包加入到classpath就能夠了。api
回頁首dom
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("-----------------------------------"); } } }
程序的輸出結果:ui
磁盤信息: 分區盤符:C 分區容量:8G 目錄數:200 文件數:1580 ----------------------------------- 磁盤信息: 分區盤符:D 分區容量:10G 目錄數:500 文件數:3000 -----------------------------------
這段程序採用了傳統的解析方式,一級一級的從根節點到子節點逐個採集咱們所須要的數據,中規中矩。試想若是這個樹足夠深,咱們想取第5 0層第三個節點的數據(誇張了點,呵呵),那將是一場噩夢!下面的內容將輕鬆化解你的這一痛苦。spa
說了那麼多JDOM和XPATH的好處,終於到了英雄有用武之地的時候了。code
JDOM的關於XPATH的api在org.jdom.xpath這個包裏。看看這個包下,只有一個類,JDOM就是如此簡潔,什麼事都不故弄玄虛的搞得那麼複雜。這個類中的核心的api主要是兩個selectNodes()和selectSingleNode()。前者根據一個xpath語句返回一組節點;後者根據一個xpath語句返回符合條件的第一個節點。orm
下面的程序咱們用JDOM+XPATH實現了上一個程序一樣的功能,你能夠從中學到很多運用XPATH 的知識:xml
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 -----------------------------------