Dom4j使用Xpath語法讀取xml節點

我們可以使用Xpath的語法來輕易的讀取xml的某個節點[類似於jQuery的選擇器]: 

 

使用Xpath語法需要添加新的jaxen-1.1-beta-7.rar 這個jar包

dom4j完整jar包我已上傳地址:

                                          http://download.csdn.net/source/3095860

 

未加入jaxen-1.1-beta-7.rar jar 報錯如下:

Exception in thread "main" java.lang.NoClassDefFoundError: org/jaxen/JaxenException
at org.dom4j.DocumentFactory.createXPath(DocumentFactory.java:230)
at org.dom4j.tree.AbstractNode.createXPath(AbstractNode.java:207)
at org.dom4j.tree.AbstractNode.selectSingleNode(AbstractNode.java:183)
at com.demo.database.DataBaseConnect.main(DataBaseConnect.java:16)


Demo:


src目錄下 employee.xml文件

 

例如要獲得id爲1或者2的employee節點:

 

 

表達式:Element database = (Element) root.selectSingleNode("//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 lang="eng">Harry Potter</title>

  <price>29.99</price>

</book>

<book>

  <title lang="eng">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 元素。

 

 

 

                                                                   -------- by:wTang 2011年3月17日0:08:15

發佈了51 篇原創文章 · 獲贊 23 · 訪問量 49萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章