xpath技术,用在dom4j中
title: xPath語法應(yīng)用
tags: xPath,dom4j
grammar_cjkRuby: true
---
在dom4j中,會使用到xPath技術(shù)。
在項目中導(dǎo)入 jaxen-1.1-beta-6.jar 包,有這個包才支持xPath技術(shù)
其語法如下:
/ 絕對路徑 表示從xml的根位置開始或子元素(一個層次結(jié)構(gòu))
// 相對路徑 表示不分任何層次結(jié)構(gòu)的選擇元素。
* 通配符 表示匹配所有元素
[] 條件 表示選擇什么條件下的元素
@ 屬性 表示選擇屬性節(jié)點
and 關(guān)系 表示條件的與關(guān)系(等價于&&)
text() 文本 表示選擇文本內(nèi)容
.
| // | 相對路徑 | 表示不分任何層次結(jié)構(gòu)的選擇元素。 |
| . | 選取當(dāng)前節(jié)點。 | |
| .. | 選取當(dāng)前節(jié)點的父節(jié)點。 | |
| * | 通配符 | 表示匹配所有元素節(jié)點 |
| [] | 條件 | 表示選擇什么條件下的元素 |
| @ | 屬性 | 表示選擇屬性節(jié)點 |
| and | 關(guān)系 | 表示條件的與關(guān)系(等價于&&) |
| text() | 文本 | 表示選擇文本內(nèi)容 |
| nodename | 選取此節(jié)點名的所有子節(jié)點。 | |
| node() | 匹配任何類型的節(jié)點。 |
博客園xPath實例
實例 1
基本的XPath語法類似于在一個文件系統(tǒng)中定位文件,如果路徑以斜線 / 開始, 那么該路徑就表示到一個元素的絕對路徑
/AAA
選擇根元素AAA
<AAA> <BBB/> <CCC/> <BBB/> <BBB/> <DDD> <BBB/> </DDD> <CCC/> </AAA>/AAA/CCC
選擇AAA的所有CCC子元素
<AAA> <BBB/> <CCC/> <BBB/> <BBB/> <DDD> <BBB/> </DDD> <CCC/> </AAA>/AAA/DDD/BBB
選擇AAA的子元素DDD的所有子元素
<AAA> <BBB/> <CCC/> <BBB/> <BBB/> <DDD> <BBB/> </DDD> <CCC/> </AAA>實例 2
如果路徑以雙斜線 // 開頭, 則表示選擇文檔中所有滿足雙斜線//之后規(guī)則的元素(無論層級關(guān)系)
//BBB
選擇所有BBB元素
<AAA> <BBB/> <CCC/> <BBB/> <DDD> <BBB/> </DDD> <CCC> <DDD> <BBB/> <BBB/> </DDD> </CCC> </AAA>//DDD/BBB
選擇所有父元素是DDD的BBB元素
<AAA> <BBB/> <CCC/> <BBB/> <DDD> <BBB/> </DDD> <CCC> <DDD> <BBB/> <BBB/> </DDD> </CCC> </AAA>實例 3
星號 * 表示選擇所有由星號之前的路徑所定位的元素
/AAA/CCC/DDD/*
選擇所有路徑依附于/AAA/CCC/DDD的元素
<AAA> <XXX> <DDD> <BBB/> <BBB/> <EEE/> <FFF/> </DDD> </XXX> <CCC> <DDD> <BBB/> <BBB/> <EEE/> <FFF/> </DDD> </CCC> <CCC> <BBB> <BBB> <BBB/> </BBB> </BBB> </CCC> </AAA>/* / * / */BBB
選擇所有的有3個祖先元素的BBB元素
<AAA> <XXX> <DDD> <BBB/> <BBB/> <EEE/> <FFF/> </DDD> </XXX> <CCC> <DDD> <BBB/> <BBB/> <EEE/> <FFF/> </DDD> </CCC> <CCC> <BBB> <BBB> <BBB/> </BBB> </BBB> </CCC> </AAA>//*
選擇所有元素
<AAA> <XXX> <DDD> <BBB/> <BBB/> <EEE/> <FFF/> </DDD> </XXX> <CCC> <DDD> <BBB/> <BBB/> <EEE/> <FFF/> </DDD> </CCC> <CCC> <BBB> <BBB> <BBB/> </BBB> </BBB> </CCC> </AAA>實例 4
方塊號里的表達式可以進一步的指定元素, 其中數(shù)字表示元素在選擇集里的位置, 而last()函數(shù)則表示選擇集中的最后一個元素.
/AAA/BBB1
選擇AAA的第一個BBB子元素
<AAA> <BBB/> <BBB/> <BBB/> <BBB/> </AAA>/AAA/BBB[last()]
選擇AAA的最后一個BBB子元素
<AAA> <BBB/> <BBB/> <BBB/> <BBB/> </AAA>實例 5
//@id
選擇所有的id屬性
<AAA> <BBB id = "b1"/> <BBB id = "b2"/> <BBB name = "bbb"/> <BBB/> </AAA>//BBB[@id]
選擇有id屬性的BBB元素
<AAA> <BBB id = "b1"/> <BBB id = "b2"/> <BBB name = "bbb"/> <BBB/> </AAA>//BBB[@name]
選擇有name屬性的BBB元素
<AAA> <BBB id = "b1"/> <BBB id = "b2"/> <BBB name = "bbb"/> <BBB/> </AAA>//BBB[@*]
選擇有任意屬性的BBB元素
<AAA> <BBB id = "b1"/> <BBB id = "b2"/> <BBB name = "bbb"/> <BBB/> </AAA>//BBB[not(@*)]
選擇沒有屬性的BBB元素
<AAA> <BBB id = "b1"/> <BBB id = "b2"/> <BBB name = "bbb"/> <BBB/> </AAA>實例 6
屬性的值可以被用來作為選擇的準(zhǔn)則, normalize-space函數(shù)刪除了前部和尾部的空格, 并且把連續(xù)的空格串替換為一個單一的空格
//BBB[@id='b1']
選擇含有屬性id且其值為'b1'的BBB元素
<AAA> <BBB id = "b1"/> <BBB name = " bbb "/> <BBB name = "bbb"/> </AAA>//BBB[@name='bbb']
選擇含有屬性name且其值為'bbb'的BBB元素
<AAA> <BBB id = "b1"/> <BBB name = " bbb "/> <BBB name = "bbb"/> </AAA>//BBB[normalize-space(@name)='bbb']
選擇含有屬性name且其值(在用normalize-space函數(shù)去掉前后空格后)為'bbb'的BBB元素
<AAA> <BBB id = "b1"/> <BBB name = " bbb "/> <BBB name = "bbb"/> </AAA>實例 7
count()函數(shù)可以計數(shù)所選元素的個數(shù)
//*[count(BBB)=2]
選擇含有2個BBB子元素的元素
<AAA> <CCC> <BBB/> <BBB/> <BBB/> </CCC> <DDD> <BBB/> <BBB/> </DDD> <EEE> <CCC/> <DDD/> </EEE> </AAA>//*[count(*)=2]
選擇含有2個子元素的元素
<AAA> <CCC> <BBB/> <BBB/> <BBB/> </CCC> <DDD> <BBB/> <BBB/> </DDD> <EEE> <CCC/> <DDD/> </EEE> </AAA>//* [count(*)=3]
選擇含有3個子元素的元素
<AAA> <CCC> <BBB/> <BBB/> <BBB/> </CCC> <DDD> <BBB/> <BBB/> </DDD> <EEE> <CCC/> <DDD/> </EEE> </AAA>實例 8
name()函數(shù)返回元素的名稱, start-with()函數(shù)在該函數(shù)的第一個參數(shù)字符串是以第二個參數(shù)字符開始的情況返回true, contains()函數(shù)當(dāng)其第一個字符串參數(shù)包含有第二個字符串參數(shù)時返回true.
//*[name()='BBB']
選擇所有名稱為BBB的元素(這里等價于//BBB)
<AAA> <BCC> <BBB/> <BBB/> <BBB/> </BCC> <DDB> <BBB/> <BBB/> </DDB> <BEC> <CCC/> <DBD/> </BEC> </AAA>//*[starts-with(name(),'B')]
選擇所有名稱以"B"起始的元素
<AAA> <BCC> <BBB/> <BBB/> <BBB/> </BCC> <DDB> <BBB/> <BBB/> </DDB> <BEC> <CCC/> <DBD/> </BEC> </AAA>//*[contains(name(),'C')]
選擇所有名稱包含"C"的元素
<AAA> <BCC> <BBB/> <BBB/> <BBB/> </BCC> <DDB> <BBB/> <BBB/> </DDB> <BEC> <CCC/> <DBD/> </BEC> </AAA>實例 10
多個路徑可以用分隔符 | 合并在一起
//CCC | //BBB
選擇所有的CCC和BBB元素
<AAA> <BBB/> <CCC/> <DDD> <CCC/> </DDD> <EEE/> </AAA>/AAA/EEE | //BBB
選擇所有的BBB元素和所有是AAA的子元素的EEE元素
<AAA> <BBB/> <CCC/> <DDD> <CCC/> </DDD> <EEE/> </AAA>/AAA/EEE | //DDD/CCC | /AAA | //BBB
可以合并的路徑數(shù)目沒有限制
<AAA> <BBB/> <CCC/> <DDD> <CCC/> </DDD> <EEE/> </AAA>實例 11
child軸(axis)包含上下文節(jié)點的子元素, 作為默認(rèn)的軸,可以忽略不寫.
/AAA
等價于 /child::AAA
<AAA> <BBB/> <CCC/> </AAA>/child::AAA
等價于/AAA
<AAA> <BBB/> <CCC/> </AAA>/AAA/BBB
等價于/child::AAA/child::BBB
<AAA> <BBB/> <CCC/> </AAA>/child::AAA/child::BBB
等價于/AAA/BBB
<AAA> <BBB/> <CCC/> </AAA>/child::AAA/BBB
二者都可以被合并
<AAA> <BBB/> <CCC/> </AAA>實例 12
descendant (后代)軸包含上下文節(jié)點的后代,一個后代是指子節(jié)點或者子節(jié)點的子節(jié)點等等, 因此descendant軸不會包含屬性和命名空間節(jié)點.
/descendant : : *
選擇文檔根元素的所有后代.即所有的元素被選擇
<AAA> <BBB> <DDD> <CCC> <DDD/> <EEE/> </CCC> </DDD> </BBB> <CCC> <DDD> <EEE> <DDD> <FFF/> </DDD> </EEE> </DDD> </CCC> </AAA>/AAA/BBB/descendant : : *
選擇/AAA/BBB的所有后代元素
<AAA> <BBB> <DDD> <CCC> <DDD/> <EEE/> </CCC> </DDD> </BBB> <CCC> <DDD> <EEE> <DDD> <FFF/> </DDD> </EEE> </DDD> </CCC> </AAA>//CCC/descendant : : *
選擇在祖先元素中有CCC的所有元素
<AAA> <BBB> <DDD> <CCC> <DDD/> <EEE/> </CCC> </DDD> </BBB> <CCC> <DDD> <EEE> <DDD> <FFF/> </DDD> </EEE> </DDD> </CCC> </AAA>//CCC/descendant : : DDD
選擇所有以CCC為祖先元素的DDD元素
<AAA> <BBB> <DDD> <CCC> <DDD/> <EEE/> </CCC> </DDD> </BBB> <CCC> <DDD> <EEE> <DDD> <FFF/> </DDD> </EEE> </DDD> </CCC> </AAA>實例 13
parent軸(axis)包含上下文節(jié)點的父節(jié)點, 如果有父節(jié)點的話
//DDD/parent: : *
選擇DDD元素的所有父節(jié)點
<AAA> <BBB> <DDD> <CCC> <DDD/> <EEE/> </CCC> </DDD> </BBB> <CCC> <DDD> <EEE> <DDD> <FFF/> </DDD> </EEE> </DDD> </CCC> </AAA>實例 14
ancestor軸(axis)包含上下節(jié)點的祖先節(jié)點, 該祖先節(jié)點由其上下文節(jié)點的父節(jié)點以及父節(jié)點的父節(jié)點等等諸如此類的節(jié)點構(gòu)成,所以ancestor軸總是包含有根節(jié)點,除非上下文節(jié)點就是根節(jié)點本身.
/AAA/BBB/DDD/CCC/EEE/ancestor : : *
選擇一個絕對路徑上的所有節(jié)點
<AAA> <BBB> <DDD> <CCC> <DDD/> <EEE/> </CCC> </DDD> </BBB> <CCC> <DDD> <EEE> <DDD> <FFF/> </DDD> </EEE> </DDD> </CCC> </AAA>//FFF/ancestor : : *
選擇FFF元素的祖先節(jié)點
<AAA> <BBB> <DDD> <CCC> <DDD/> <EEE/> </CCC> </DDD> </BBB> <CCC> <DDD> <EEE> <DDD> <FFF/> </DDD> </EEE> </DDD> </CCC> </AAA>實例 15
following-sibling軸(axis)包含上下文節(jié)點之后的所有兄弟節(jié)點
/AAA/BBB/following-sibling : : *
<AAA> <BBB> <CCC/> <DDD/> </BBB> <XXX> <DDD> <EEE/> <DDD/> <CCC/> <FFF/> <FFF> <GGG/> </FFF> </DDD> </XXX> <CCC> <DDD/> </CCC> </AAA>//CCC/following-sibling: : *
<AAA> <BBB> <CCC/> <DDD/> </BBB> <XXX> <DDD> <EEE/> <DDD/> <CCC/> <FFF/> <FFF> <GGG/> </FFF> </DDD> </XXX> <CCC> <DDD/> </CCC> </AAA>實例 16
preceding-sibling 軸(axis)包含上下文節(jié)點之前的所有兄弟節(jié)點
/AAA/XXX/preceding-sibling : : *
<AAA> <BBB> <CCC/> <DDD/> </BBB> <XXX> <DDD> <EEE/> <DDD/> <CCC/> <FFF/> <FFF> <GGG/> </FFF> </DDD> </XXX> <CCC> <DDD/> </CCC> </AAA>//CCC/preceding-sibling : : *
<AAA> <BBB> <CCC/> <DDD/> </BBB> <XXX> <DDD> <EEE/> <DDD/> <CCC/> <FFF/> <FFF> <GGG/> </FFF> </DDD> </XXX> <CCC> <DDD/> </CCC> </AAA>實例 17
following軸(axis)包含同一文檔中按文檔順序位于上下文節(jié)點之后的所有節(jié)點, 除了祖先節(jié)點,屬性節(jié)點和命名空間節(jié)點
/AAA/XXX/following : : *
<AAA> <BBB> <CCC/> <ZZZ> <DDD/> <DDD> <EEE/> </DDD> </ZZZ> <FFF> <GGG/> </FFF> </BBB> <XXX> <DDD> <EEE/> <DDD/> <CCC/> <FFF/> <FFF> <GGG/> </FFF> </DDD> </XXX> <CCC> <DDD/> </CCC> </AAA>//ZZZ/following : : *
<AAA> <BBB> <CCC/> <ZZZ> <DDD/> <DDD> <EEE/> </DDD> </ZZZ> <FFF> <GGG/> </FFF> </BBB> <XXX> <DDD> <EEE/> <DDD/> <CCC/> <FFF/> <FFF> <GGG/> </FFF> </DDD> </XXX> <CCC> <DDD/> </CCC> </AAA>實例 18
preceding軸(axis)包含同一文檔中按文檔順序位于上下文節(jié)點之前的所有節(jié)點, 除了祖先節(jié)點,屬性節(jié)點和命名空間節(jié)點
/AAA/XXX/preceding: : *
<AAA> <BBB> <CCC/> <ZZZ> <DDD/> </ZZZ> </BBB> <XXX> <DDD> <EEE/> <DDD/> <CCC/> <FFF/> <FFF> <GGG/> </FFF> </DDD> </XXX> <CCC> <DDD/> </CCC> </AAA>//GGG/preceding : : *
<AAA> <BBB> <CCC/> <ZZZ> <DDD/> </ZZZ> </BBB> <XXX> <DDD> <EEE/> <DDD/> <CCC/> <FFF/> <FFF> <GGG/> </FFF> </DDD> </XXX> <CCC> <DDD/> </CCC> </AAA>實例 19
descendant-or-self 軸(axis)包含上下文節(jié)點本身和該節(jié)點的后代節(jié)點
/AAA/XXX/descendant-or-self : : *
<AAA> <BBB> <CCC/> <ZZZ> <DDD/> </ZZZ> </BBB> <XXX> <DDD> <EEE/> <DDD/> <CCC/> <FFF/> <FFF> <GGG/> </FFF> </DDD> </XXX> <CCC> <DDD/> </CCC> </AAA>//CCC/descendant-or-self : : *
<AAA> <BBB> <CCC/> <ZZZ> <DDD/> </ZZZ> </BBB> <XXX> <DDD> <EEE/> <DDD/> <CCC/> <FFF/> <FFF> <GGG/> </FFF> </DDD> </XXX> <CCC> <DDD/> </CCC> </AAA>實例 20
ancestor-or-self 軸(axis)包含上下文節(jié)點本身和該節(jié)點的祖先節(jié)點
/AAA/XXX/DDD/EEE/ancestor-or-self : : *
<AAA> <BBB> <CCC/> <ZZZ> <DDD/> </ZZZ> </BBB> <XXX> <DDD> <EEE/> <DDD/> <CCC/> <FFF/> <FFF> <GGG/> </FFF> </DDD> </XXX> <CCC> <DDD/> </CCC> </AAA>//GGG/ancestor-or-self : : *
<AAA> <BBB> <CCC/> <ZZZ> <DDD/> </ZZZ> </BBB> <XXX> <DDD> <EEE/> <DDD/> <CCC/> <FFF/> <FFF> <GGG/> </FFF> </DDD> </XXX> <CCC> <DDD/> </CCC> </AAA>實例 21
ancestor, descendant, following, preceding 和self軸(axis)分割了XML文檔(忽略屬性節(jié)點和命名空間節(jié)點), 不能交迭, 而一起使用則包含所有節(jié)點
//GGG/ancestor : : *
<AAA> <BBB> <CCC/> <ZZZ/> </BBB> <XXX> <DDD> <EEE/> <FFF> <HHH/> <GGG> <JJJ> <QQQ/> </JJJ> <JJJ/> </GGG> <HHH/> </FFF> </DDD> </XXX> <CCC> <DDD/> </CCC> </AAA>//GGG/descendant: : *
<AAA> <BBB> <CCC/> <ZZZ/> </BBB> <XXX> <DDD> <EEE/> <FFF> <HHH/> <GGG> <JJJ> <QQQ/> </JJJ> <JJJ/> </GGG> <HHH/> </FFF> </DDD> </XXX> <CCC> <DDD/> </CCC> </AAA>//GGG/following:: *
<AAA> <BBB> <CCC/> <ZZZ/> </BBB> <XXX> <DDD> <EEE/> <FFF> <HHH/> <GGG> <JJJ> <QQQ/> </JJJ> <JJJ/> </GGG> <HHH/> </FFF> </DDD> </XXX> <CCC> <DDD/> </CCC> </AAA>//GGG/preceding:: *
<AAA> <BBB> <CCC/> <ZZZ/> </BBB> <XXX> <DDD> <EEE/> <FFF> <HHH/> <GGG> <JJJ> <QQQ/> </JJJ> <JJJ/> </GGG> <HHH/> </FFF> </DDD> </XXX> <CCC> <DDD/> </CCC> </AAA>//GGG/self:: *
<AAA> <BBB> <CCC/> <ZZZ/> </BBB> <XXX> <DDD> <EEE/> <FFF> <HHH/> <GGG> <JJJ> <QQQ/> </JJJ> <JJJ/> </GGG> <HHH/> </FFF> </DDD> </XXX> <CCC> <DDD/> </CCC> </AAA>//GGG/ancestor:: * | //GGG/descendant:: * | //GGG/following:: * | //GGG/preceding:: * | //GGG/self:: *
<AAA> <BBB> <CCC/> <ZZZ/> </BBB> <XXX> <DDD> <EEE/> <FFF> <HHH/> <GGG> <JJJ> <QQQ/> </JJJ> <JJJ/> </GGG> <HHH/> </FFF> </DDD> </XXX> <CCC> <DDD/> </CCC> </AAA>實例 22
div運算符做浮點除法運算, mod運算符做求余運算, floor函數(shù)返回不大于參數(shù)的最大整數(shù)(趨近于正無窮), ceiling返回不小于參數(shù)的最小整數(shù)(趨近于負無窮)
//BBB[position() mod 2 = 0 ]
選擇偶數(shù)位置的BBB元素
<AAA> <BBB/> <BBB/> <BBB/> <BBB/> <BBB/> <BBB/> <BBB/> <BBB/> <CCC/> <CCC/> <CCC/> </AAA>//BBB[ position() = floor(last() div 2 + 0.5) or position() = ceiling(last() div 2 + 0.5) ]
選擇中間的BBB元素
<AAA> <BBB/> <BBB/> <BBB/> <BBB/> <BBB/> <BBB/> <BBB/> <BBB/> <CCC/> <CCC/> <CCC/> </AAA>//CCC[ position() = floor(last() div 2 + 0.5) or position() = ceiling(last() div 2 + 0.5) ]
選擇中間的CCC元素
<AAA> <BBB/> <BBB/> <BBB/> <BBB/> <BBB/> <BBB/> <BBB/> <BBB/> <CCC/> <CCC/> <CCC/> </AAA>轉(zhuǎn)載于:https://www.cnblogs.com/renboqie/p/5568813.html
總結(jié)
以上是生活随笔為你收集整理的xpath技术,用在dom4j中的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 学生选课数据库SQL语句练习题——成绩表
- 下一篇: 端午小长假--前端基础学起来02与浏览器