Dom4j使用Xpath語法讀取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) {
} }</pre>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(); }
表達式: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 元素。