XPath 教程(好東東難求,不敢不粘出來)
Posted on 2006-09-19 18:02 泰仔在線 閱讀(1046) 評(píng)論(0) 編輯 收藏 所屬分類: Java 相關(guān)(整理自:http://www.zvon.org/xxl/XPathTutorial/General_chi/examples.html)
簡(jiǎn)介
XPath由W3C的 XPath 1.0 標(biāo)準(zhǔn) 描述.本教程通過實(shí)例來展示XPath的一些特性.
你可以從以下內(nèi)容開始:
1。基本的XPath語法類似于在一個(gè)文件系統(tǒng)中定位文件,如果路徑以斜線 / 開始, 那么該路徑就表示到一個(gè)元素的絕對(duì)路徑
/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ī)則的元素(無論層級(jí)關(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。星號(hào) * 表示選擇所有由星號(hào)之前的路徑所定位的元素
/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個(gè)祖先元素的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。方塊號(hào)里的表達(dá)式可以進(jìn)一步的指定元素, 其中數(shù)字表示元素在選擇集里的位置, 而last()函數(shù)則表示選擇集中的最后一個(gè)元素.
/AAA/BBB[1] |
---|
選擇AAA的第一個(gè)BBB子元素 |
<AAA> <BBB/> <BBB/> <BBB/> <BBB/> </AAA> |
/AAA/BBB[last()] |
---|
選擇AAA的最后一個(gè)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ù)的空格串替換為一個(gè)單一的空格
//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ù)可以計(jì)數(shù)所選元素的個(gè)數(shù)
//*[count(BBB)=2] |
---|
選擇含有2個(gè)BBB子元素的元素 |
<AAA> <CCC> <BBB/> <BBB/> <BBB/> </CCC> <DDD> <BBB/> <BBB/> </DDD> <EEE> <CCC/> <DDD/> </EEE> </AAA> |
//*[count(*)=2] |
---|
選擇含有2個(gè)子元素的元素 |
<AAA> <CCC> <BBB/> <BBB/> <BBB/> </CCC> <DDD> <BBB/> <BBB/> </DDD> <EEE> <CCC/> <DDD/> </EEE> </AAA> |
//*[count(*)=3] |
---|
選擇含有3個(gè)子元素的元素 |
<AAA> <CCC> <BBB/> <BBB/> <BBB/> </CCC> <DDD> <BBB/> <BBB/> </DDD> <EEE> <CCC/> <DDD/> </EEE> </AAA> |
8。name()函數(shù)返回元素的名稱, start-with()函數(shù)在該函數(shù)的第一個(gè)參數(shù)字符串是以第二個(gè)參數(shù)字符開始的情況返回true, contains()函數(shù)當(dāng)其第一個(gè)字符串參數(shù)包含有第二個(gè)字符串參數(shù)時(shí)返回true.
//*[name()='BBB'] |
---|
選擇所有名稱為BBB的元素(這里等價(jià)于//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> |
9。string-length函數(shù)返回字符串的字符數(shù),你應(yīng)該用<替代<, 用>代替>
//*[string-length(name()) = 3] |
---|
選擇名字長(zhǎng)度為3的元素 |
<AAA> <Q/> <SSSS/> <BB/> <CCC/> <DDDDDDDD/> <EEEE/> </AAA> |
//*[string-length(name()) < 3] |
---|
選擇名字長(zhǎng)度小于3的元素 |
<AAA> <Q/> <SSSS/> <BB/> <CCC/> <DDDDDDDD/> <EEEE/> </AAA> |
//*[string-length(name()) > 3] |
---|
選擇名字長(zhǎng)度大于3的元素 |
<AAA> <Q/> <SSSS/> <BB/> <CCC/> <DDDDDDDD/> <EEEE/> </AAA> |
10。多個(gè)路徑可以用分隔符 | 合并在一起
//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é)點(diǎn)的子元素, 作為默認(rèn)的軸,可以忽略不寫.
/AAA |
---|
等價(jià)于 /child::AAA |
<AAA> <BBB/> <CCC/> </AAA> |
/child::AAA |
---|
等價(jià)于/AAA |
<AAA> <BBB/> <CCC/> </AAA> |
/AAA/BBB |
---|
等價(jià)于/child::AAA/child::BBB |
<AAA> <BBB/> <CCC/> </AAA> |
/child::AAA/child::BBB |
---|
等價(jià)于/AAA/BBB |
<AAA> <BBB/> <CCC/> </AAA> |
/child::AAA/BBB |
---|
二者都可以被合并 |
<AAA> <BBB/> <CCC/> </AAA> |
12。descendant (后代)軸包含上下文節(jié)點(diǎn)的后代,一個(gè)后代是指子節(jié)點(diǎn)或者子節(jié)點(diǎn)的子節(jié)點(diǎn)等等, 因此descendant軸不會(huì)包含屬性和命名空間節(jié)點(diǎn).
/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é)點(diǎn)的父節(jié)點(diǎn), 如果有父節(jié)點(diǎn)的話
//DDD/parent::* |
---|
選擇DDD元素的所有父節(jié)點(diǎn) |
<AAA> <BBB> <DDD> <CCC> <DDD/> <EEE/> </CCC> </DDD> </BBB> <CCC> <DDD> <EEE> <DDD> <FFF/> </DDD> </EEE> </DDD> </CCC> </AAA> |
14。ancestor軸(axis)包含上下節(jié)點(diǎn)的祖先節(jié)點(diǎn), 該祖先節(jié)點(diǎn)由其上下文節(jié)點(diǎn)的父節(jié)點(diǎn)以及父節(jié)點(diǎn)的父節(jié)點(diǎn)等等諸如此類的節(jié)點(diǎn)構(gòu)成,所以ancestor軸總是包含有根節(jié)點(diǎn),除非上下文節(jié)點(diǎn)就是根節(jié)點(diǎn)本身.
/AAA/BBB/DDD/CCC/EEE/ancestor::* |
---|
選擇一個(gè)絕對(duì)路徑上的所有節(jié)點(diǎn) |
<AAA> <BBB> <DDD> <CCC> <DDD/> <EEE/> </CCC> </DDD> </BBB> <CCC> <DDD> <EEE> <DDD> <FFF/> </DDD> </EEE> </DDD> </CCC> </AAA> |
//FFF/ancestor::* |
---|
選擇FFF元素的祖先節(jié)點(diǎn) |
<AAA> <BBB> <DDD> <CCC> <DDD/> <EEE/> </CCC> </DDD> </BBB> <CCC> <DDD> <EEE> <DDD> <FFF/> </DDD> </EEE> </DDD> </CCC> </AAA> |
15。following-sibling軸(axis)包含上下文節(jié)點(diǎn)之后的所有兄弟節(jié)點(diǎn)
/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é)點(diǎn)之前的所有兄弟節(jié)點(diǎn)
/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é)點(diǎn)之后的所有節(jié)點(diǎn), 除了祖先節(jié)點(diǎn),屬性節(jié)點(diǎn)和命名空間節(jié)點(diǎn)
/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。following軸(axis)包含同一文檔中按文檔順序位于上下文節(jié)點(diǎn)之前的所有節(jié)點(diǎn), 除了祖先節(jié)點(diǎn),屬性節(jié)點(diǎn)和命名空間節(jié)點(diǎn)
/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é)點(diǎn)本身和該節(jié)點(diǎn)的后代節(jié)點(diǎn)
/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é)點(diǎn)本身和該節(jié)點(diǎn)的祖先節(jié)點(diǎn)
/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é)點(diǎn)和命名空間節(jié)點(diǎn)), 不能交迭, 而一起使用則包含所有節(jié)點(diǎn)
//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運(yùn)算符做浮點(diǎn)除法運(yùn)算, mod運(yùn)算符做求余運(yùn)算, floor函數(shù)返回不大于參數(shù)的最大整數(shù)(趨近于正無窮), ceiling返回不小于參數(shù)的最小整數(shù)(趨近于負(fù)無窮)
//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> |