Dom4j使用Xpath語法讀取xml節點

jopen 10年前發布 | 39K 次閱讀 Dom4j XML操作類庫

package com.wt.dom4j;
import java.util.List;
import org.dom4j.Document;
import org.dom4j.Element;
import org.dom4j.io.SAXReader;
/**

  • Dom4j基礎操作
  • @author wTang
  • @editTime 2011年3月16日0:38:10
  • */ public class Dom4jParser { public static void main(String[] args) {
     try {
         SAXReader sax = new SAXReader();
         // 獲得dom4j的文檔對象
         Document root = sax.read(Dom4jParser.class.getClassLoader()
                 .getResourceAsStream("employee.xml"));
         // 得到database節點
         Element database = (Element) root
                 .selectSingleNode("http://employee[@id='2']");
         List list = database.elements(); // 得到database元素下的子元素集合
         /*
          * 循環遍歷集合中的每一個元素 將每一個元素的元素名和值在控制臺中打印出來
          */
         for (Object obj : list) {
             Element element = (Element) obj;
             // getName()是元素名,getText()是元素值
             System.out
                     .println(element.getName() + ": " + element.getText());
         }
     } catch (Exception e) {
         e.printStackTrace();
     }
    
    } }</pre>

    表達式:Element database = (Element) root.selectSingleNode("http://employee[@id='2']");

     

    輸出為:

    name: wTang2
    age: 20

    high: 180

     

    表達式:   Element database = (Element) root.selectSingleNode("/root/employee[1]");

    輸出為:
    name: wTang
    age: 19
    high: 173
     

     

    我們可以給id里面的值做個參數, 封裝為方法即可給外界調用. 

     

     

    //     表示      從匹配選擇的當前節點選擇文檔中的節點,而不考慮它們的位置。

    /      表示      從根節點選取。 

    @和jq的屬性選擇器類似  選擇id=2為2的節點

    [1] 表示獲取employee的第一個元素,[2]就表示第二個了.

     

     

    Xpath的語法靈活多變,只寫這么點了.讀取單個節點可以選擇Xpath.


    疑問:

    xPath好像不能一次讀取整個xml文件  

    比如:  /root//employee   

    返回的是一個封裝的List  長度為3

    如果是List做嵌套那么List的長度應該是2,再嵌套2個List.

    結果只讀取到了1個employee(3個節點).Xpath應該是不支持批量讀取的吧. 

    如果可以的話還請你告訴我下.

     

     

     

     

     


    Xpath語法官方文檔:

     

    <?xml version="1.0" encoding="ISO-8859-1"?>

    <bookstore>

    <book>

      <title>Harry Potter</title>

      <price>29.99</price>

    </book>

    <book>

      <title>Learning XML</title>

      <price>39.95</price>

    </book>

    </bookstore>

    選取節點

    XPath 使用路徑表達式在 XML 文檔中選取節點。節點是通過沿著路徑或者 step 來選取的。

    下面列出了最有用的路徑表達式:

    表達式

    描述

    nodename

    選取此節點的所有子節點

    /

    從根節點選取。

    //

    從匹配選擇的當前節點選擇文檔中的節點,而不考慮它們的位置。

    .

    選取當前節點。

    ..

    選取當前節點的父節點。

    @

    選取屬性。

    實例

    在下面的表格中,我們已列出了一些路徑表達式以及表達式的結果:

    路徑表達式

    結果

    bookstore

    選取 bookstore 元素的所有子節點

    /bookstore

    選取根元素 bookstore

    注釋:假如路徑起始于正斜杠( / ),則此路徑始終代表到某元素的絕對路徑!

    bookstore/book

    選取屬于 bookstore 的子元素的所有 book 元素。

    //book

    選取所有 book 子元素,而不管它們在文檔中的位置。

    bookstore//book

    選擇屬于 bookstore 元素的后代的所有 book 元素,而不管它們位于 bookstore 之下的什么位置。

    //@lang

    選取名為 lang 的所有屬性。

    謂語(Predicates

    謂語用來查找某個特定的節點或者包含某個指定的值的節點。

    謂語被嵌在方括號中。

    實例

    在下面的表格中,我們列出了帶有謂語的一些路徑表達式,以及表達式的結果:

    路徑表達式

    結果

    /bookstore/book[1]

    選取屬于 bookstore 子元素的第一個 book 元素。

    /bookstore/book[last()]

    選取屬于 bookstore 子元素的最后一個 book 元素。

    /bookstore/book[last()-1]

    選取屬于 bookstore 子元素的倒數第二個 book 元素。

    /bookstore/book[position()<3]

    選取最前面的兩個屬于 bookstore 元素的子元素的 book 元素。

    //title[@lang]

    選取所有擁有名為 lang 的屬性的 title 元素。

    //title[@lang='eng']

    選取所有 title 元素,且這些元素擁有值為 eng  lang 屬性。

    /bookstore/book[price>35.00]

    選取 bookstore 元素的所有 book 元素,且其中的 price 元素的值須大于 35.00

    /bookstore/book[price>35.00]/title

    選取 bookstore 元素中的 book 元素的所有 title 元素,且其中的 price 元素的值須大于 35.00

    選取未知節點

    XPath 通配符可用來選取未知的 XML 元素。

    通配符

    描述

    *

    匹配任何元素節點。

    @*

    匹配任何屬性節點。

    node()

    匹配任何類型的節點。

    實例

    在下面的表格中,我們列出了一些路徑表達式,以及這些表達式的結果:

    路徑表達式

    結果

    /bookstore/*

    選取 bookstore 元素的所有子元素。

    //*

    選取文檔中的所有元素。

    //title[@*]

    選取所有帶有屬性的 title 元素。

    選取若干路徑

    通過在路徑表達式中使用“|”運算符,您可以選取若干個路徑。

    實例

    在下面的表格中,我們列出了一些路徑表達式,以及這些表達式的結果:

    路徑表達式

    結果

    //book/title | //book/price

    選取 book 元素的所有 title  price 元素。

    //title | //price

    選取文檔中的所有 title  price 元素。

    /bookstore/book/title | //price

    選取屬于 bookstore 元素的 book 元素的所有 title 元素,以及文檔中所有的 price 元素。

 本文由用戶 jopen 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
 轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
 本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!