JAVA EVERY DAY

          DAY DAY UP , STUDY HARD

          常用鏈接

          統(tǒng)計(jì)

          積分與排名

          developerWorks Sites

          Java

          JBlog

          OpenSource

          最新評(píng)論

          JDOM處理XML快速上手--結(jié)合XPATH

          XPATH基礎(chǔ)
          ?????? XPATH遵循文檔對(duì)象模型(DOM)的路徑格式,基本語法由表達(dá)式構(gòu)成。在計(jì)算表達(dá)式的值之后產(chǎn)生一個(gè)對(duì)象,這種對(duì)象有以下四種基本類型:節(jié)點(diǎn)集合、布爾型、數(shù)字型和字符
          串型。XPATH基本上和在文件系統(tǒng)中尋找文件類似,如果路徑是以"/"開頭的,就表明該路徑表示的是一個(gè)絕對(duì)路徑,這和在UNIX系統(tǒng)中關(guān)于文件路徑的定義是一致的。以"http://"開頭
          則表示在文檔中的任意位置查找。
          ?????? 以樣例XML文檔(friends.xml)為例來了解XPATH:
          xml文件
          ????? 在XML文檔中使用位置路徑表達(dá)式來查找信息,這些表達(dá)式有很多種組成方式。一般我們用得最多的恐怕是 節(jié)點(diǎn)元素 查找。XPATH中用正斜杠(/)來分隔子結(jié)點(diǎn),返回所有與
          模式相匹配的元素。下面以幾個(gè) 表達(dá)式 的例子來說明一下返回結(jié)果:
          ????? 表達(dá)式:/friends/friend
          ????? 返回:根元素friends下所有的 friend 元素(或節(jié)點(diǎn))。(當(dāng)然本例只有一個(gè)啦!)
          ?
          ????? 表達(dá)式:/friends/*
          ????? 返回:根元素friends下所有的元素(或節(jié)點(diǎn))。(“*”相當(dāng)于通配符,表示“所有”的)
          ?
          ????? 表達(dá)式://friend
          ???? ?返回:任意元素(或節(jié)點(diǎn))下的所有 friend 元素(或節(jié)點(diǎn))。(注意:不僅僅是1中 根元素friends下面的friend元素,如果存在的話)
          ?
          ????? 表達(dá)式:/friends/friend[@number='1']
          ???? ?返回:根元素下元素名稱為 friend,number屬性為'1'的全部元素(或節(jié)點(diǎn))。(對(duì)于元素或節(jié)點(diǎn)的附加元素,比如屬性,函數(shù)等都要用方括號(hào)"[]"擴(kuò)起來,屬性前面要加
          上"@"號(hào))
          ?
          ????? 表達(dá)式:/friends/friend/phone[text()='87654321']
          ????? 返回:元素friends/friend下電話號(hào)碼為 87654321 的全部元素。(text()是XPATH的函數(shù),功能是取出當(dāng)前節(jié)點(diǎn)的文本內(nèi)容,即content。)
          ?
          ????? 表達(dá)式://name/parent::*
          ????? 返回:name元素的所有父元素(或節(jié)點(diǎn))。(parent::* 表示這個(gè)元素的所有的父節(jié)點(diǎn)的集合)
          ?
          ????? 上面的介紹對(duì)于我們一般的應(yīng)用基本上夠用了,如果你需要進(jìn)一步的深入,請(qǐng)查看W3C發(fā)布的關(guān)于XAPH的官方資料。
          ?
          JDOM+XPATH應(yīng)用
          ?
          ???? ?現(xiàn)在我們開始使用XPATH結(jié)合JDOM來操作XML文件了。JDOM的關(guān)于XPATH的api只有一個(gè)類:Xpath.java,在org.jdom.xpath這個(gè)包中。這個(gè)類中的核心方法主要是兩個(gè)靜態(tài)方法
          selectNodes()和selectSingleNode()。前者根據(jù)一個(gè)xpath語句返回一組節(jié)點(diǎn):List;后者根據(jù)一個(gè)xpath語句返回符合條件的第一個(gè)節(jié)點(diǎn):Object。
          ???????? public static List selectNodes(Object arg1,String arg2) throws org.jdom.JDOMException;
          ???????? public static Object selectSingleNode(Object arg1,String arg2) throws org.jdom.JDOMException;
          ?????
          ????? 在使用XPATH之前,請(qǐng)先確定你的classpath路徑里面有如下幾個(gè)JAR包,如果沒有,請(qǐng)從JDOM的發(fā)行包中l(wèi)ib目錄下copy:
          ???????? saxpaht.jar
          ???????? jaxen-core.jar
          ???????? jaxen-jdom.jar

          樣列JAVA代碼:

          package ??cyberobject.com.xpath;?

          ?????
          import ??java.io.IOException;
          ?????
          import ??java.util.List;?
          ?????
          import ??org.jdom.Document;
          ?????
          import ??org.jdom.Element;
          ?????
          import ??org.jdom.Text;
          ?????
          import ??org.jdom.JDOMException;
          ?????
          import ??org.jdom.input.SAXBuilder;
          ?????
          import ??org.jdom.xpath.XPath;?
          ?????
          /** ? */ ? /** ?
          ?????*??
          @author ??wanghua
          ?????*
          ?????*?TODO?To?change?the?template?for?this?generated?type?comment?go?to
          ?????*?Window?-?Preferences?-?Java?-?Code?Style?-?Code?Templates
          ??????
          */
          ?
          ??????
          public ? class ?XpathSample??? {
          ??????????
          public ? static ? void ?main(String[]?args)? throws ?JDOMException,?IOException?? {
          ???????????????SAXBuilder?sb?
          = ? new ??SAXBuilder();
          ???????????????Document?doc??
          = ?sb.build(? " ?friends.xml? " ?);
          ???????????????Element?root??
          = ?doc.getRootElement();
          ??????
          ???????????????List?list?
          = ?XPath.selectNodes(root,? " ?/friends/friend? " ?);
          ???????????????System.out.println(?
          " ?[info]?Friends?List:? " ?);
          ???????????????
          ???????????????
          for ?(? int ??ii?? = ??? 0 ?;?ii?? < ??list.size();?ii? ++ ?)?? {
          ??????????????????Element?element??
          = ??(Element)list.get(ii);
          ??????????????????String?number??
          = ??element.getAttributeValue(? " ?number? " ?);
          ???????
          ??????????????????
          // ?String?name?=?element.getChildText("name");?
          ??????????????????String?name?? = ??(?(Text)?XPath.selectSingleNode(element,? " ?//friend[@number='? " ??? + ??number?? + ??? " ?']/name/text()? " ?)).getTextNormalize();?
          ??????????????????
          // ?String?sex?=?element.getChild("sex").getAttributeValue("value");?
          ??????????????????String?sex?? = ??((Element)XPath.selectSingleNode(element,? " ?//friend[@number='? " ??? + ??number?? + ??? " ?']/sex? " ?)).getAttributeValue(? " ?value? " ?);
          ???????????????????
          ??????????????????
          // ?String?phone?=?element.getChildText("phone");?
          ??????????????????String?phone?? = ??(?(Text)?XPath.selectSingleNode(element,? " ?//friend[@number='? " ??? + ??number?? + ??? " ?']/phone/text()? " ?)).getText();
          ???????????????????
          ??????????????????System.out.println(?
          " ?No.? " ? + ?number);
          ??????????????????System.out.println(?
          " ??Name:[? " ??? + ??name?? + ??? " ?]? " ?);
          ??????????????????System.out.println(?
          " ??Sex:[? " ??? + ??sex?? + ??? " ?]? " ?);
          ??????????????????System.out.println(?
          " ??Phone:[? " ??? + ??phone?? + ??? " ?]? " ?);
          ??????????????????System.out.println();
          ???????????????}
          ???
          ???????????????System.out.println(?
          " ?[info]?End?of?Friends?List.? " ?);
          ?????????}
          ?
          ????}
          ??

          輸出結(jié)果:
          [info] Friends List:
          No.1
          ?Name:[zoof]
          ?Sex:[male]
          ?Phone:[87654321]
          No.2
          ?Name:[joe]
          ?Sex:[male]
          ?Phone:[87654322]
          No.3
          ?Name:[joe]
          ?Sex:[female]
          ?Phone:[87654323]
          [info] End of Friends List.

          posted on 2007-03-17 10:46 沒有魚的水 閱讀(884) 評(píng)論(0)  編輯  收藏 所屬分類: XML


          只有注冊(cè)用戶登錄后才能發(fā)表評(píng)論。


          網(wǎng)站導(dǎo)航:
           
          主站蜘蛛池模板: 光泽县| 合川市| 长治县| 扎鲁特旗| 十堰市| 两当县| 安陆市| 盐亭县| 闽侯县| 石景山区| 池州市| 红河县| 安远县| 勐海县| 洛南县| 黄山市| 十堰市| 嘉义县| 兴和县| 云霄县| 巴东县| 墨玉县| 城步| 丰城市| 翼城县| 东港市| 长顺县| 桑植县| 建德市| 榆社县| 赤城县| 青海省| 茂名市| 土默特右旗| 双柏县| 南乐县| 嘉兴市| 宜兰县| 北碚区| 吉木乃县| 壶关县|