JAVA EVERY DAY

          DAY DAY UP , STUDY HARD

          常用鏈接

          統計

          積分與排名

          developerWorks Sites

          Java

          JBlog

          OpenSource

          最新評論

          JDOM處理XML快速上手--結合XPATH

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

          輸出結果:
          [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) 評論(0)  編輯  收藏 所屬分類: XML


          只有注冊用戶登錄后才能發表評論。


          網站導航:
           
          主站蜘蛛池模板: 罗定市| 涞源县| 阿勒泰市| 克什克腾旗| 澜沧| 泸西县| 连州市| 旌德县| 徐水县| 新丰县| 正蓝旗| 凤冈县| 抚松县| 东兴市| 剑川县| 宁夏| 阳曲县| 林州市| 黑水县| 通海县| 剑川县| 郸城县| 井研县| 十堰市| 邳州市| 鄂伦春自治旗| 全州县| 汪清县| 苗栗市| 安龙县| 涟源市| 浦江县| 阳东县| 磐石市| 新营市| 台安县| 鹤庆县| 馆陶县| 上蔡县| 商南县| 克东县|