title: xPath语法应用

tags: xPath,dom4j

grammar_cjkRuby: true

在dom4j中,会使用到xPath技术。

在项目中导入 jaxen-1.1-beta-6.jar 包,有这个包才支持xPath技术

其语法如下:

/ 绝对路径 表示从xml的根位置开始或子元素(一个层次结构)

// 相对路径 表示不分任何层次结构的选择元素。

* 通配符 表示匹配所有元素

[] 条件 表示选择什么条件下的元素

@ 属性 表示选择属性节点

and 关系 表示条件的与关系(等价于&&)

text() 文本 表示选择文本内容

.

/ 绝对路径 表示从xml的根位置开始或子元素(一个层次结构)
// 相对路径 表示不分任何层次结构的选择元素。
. 选取当前节点。
.. 选取当前节点的父节点。
* 通配符 表示匹配所有元素节点
[] 条件 表示选择什么条件下的元素
@ 属性 表示选择属性节点
and 关系 表示条件的与关系(等价于&&)
text() 文本 表示选择文本内容
nodename 选取此节点名的所有子节点。
node() 匹配任何类型的节点。

博客园xPath实例

实例 1

基本的XPath语法类似于在一个文件系统中定位文件,如果路径以斜线 / 开始, 那么该路径就表示到一个元素的绝对路径

/AAA

选择根元素AAA

  1. <AAA>
  2. <BBB/>
  3. <CCC/>
  4. <BBB/>
  5. <BBB/>
  6. <DDD>
  7. <BBB/>
  8. </DDD>
  9. <CCC/>
  10. </AAA>

/AAA/CCC

选择AAA的所有CCC子元素

  1. <AAA>
  2. <BBB/>
  3. <CCC/>
  4. <BBB/>
  5. <BBB/>
  6. <DDD>
  7. <BBB/>
  8. </DDD>
  9. <CCC/>
  10. </AAA>

/AAA/DDD/BBB

选择AAA的子元素DDD的所有子元素

  1. <AAA>
  2. <BBB/>
  3. <CCC/>
  4. <BBB/>
  5. <BBB/>
  6. <DDD>
  7. <BBB/>
  8. </DDD>
  9. <CCC/>
  10. </AAA>

实例 2

如果路径以双斜线 // 开头, 则表示选择文档中所有满足双斜线//之后规则的元素(无论层级关系)

//BBB

选择所有BBB元素

  1. <AAA>
  2. <BBB/>
  3. <CCC/>
  4. <BBB/>
  5. <DDD>
  6. <BBB/>
  7. </DDD>
  8. <CCC>
  9. <DDD>
  10. <BBB/>
  11. <BBB/>
  12. </DDD>
  13. </CCC>
  14. </AAA>

//DDD/BBB

选择所有父元素是DDD的BBB元素

  1. <AAA>
  2. <BBB/>
  3. <CCC/>
  4. <BBB/>
  5. <DDD>
  6. <BBB/>
  7. </DDD>
  8. <CCC>
  9. <DDD>
  10. <BBB/>
  11. <BBB/>
  12. </DDD>
  13. </CCC>
  14. </AAA>

实例 3

星号 * 表示选择所有由星号之前的路径所定位的元素

/AAA/CCC/DDD/*

选择所有路径依附于/AAA/CCC/DDD的元素

  1. <AAA>
  2. <XXX>
  3. <DDD>
  4. <BBB/>
  5. <BBB/>
  6. <EEE/>
  7. <FFF/>
  8. </DDD>
  9. </XXX>
  10. <CCC>
  11. <DDD>
  12. <BBB/>
  13. <BBB/>
  14. <EEE/>
  15. <FFF/>
  16. </DDD>
  17. </CCC>
  18. <CCC>
  19. <BBB>
  20. <BBB>
  21. <BBB/>
  22. </BBB>
  23. </BBB>
  24. </CCC>
  25. </AAA>

/* / * / */BBB

选择所有的有3个祖先元素的BBB元素

  1. <AAA>
  2. <XXX>
  3. <DDD>
  4. <BBB/>
  5. <BBB/>
  6. <EEE/>
  7. <FFF/>
  8. </DDD>
  9. </XXX>
  10. <CCC>
  11. <DDD>
  12. <BBB/>
  13. <BBB/>
  14. <EEE/>
  15. <FFF/>
  16. </DDD>
  17. </CCC>
  18. <CCC>
  19. <BBB>
  20. <BBB>
  21. <BBB/>
  22. </BBB>
  23. </BBB>
  24. </CCC>
  25. </AAA>

//*

选择所有元素

  1. <AAA>
  2. <XXX>
  3. <DDD>
  4. <BBB/>
  5. <BBB/>
  6. <EEE/>
  7. <FFF/>
  8. </DDD>
  9. </XXX>
  10. <CCC>
  11. <DDD>
  12. <BBB/>
  13. <BBB/>
  14. <EEE/>
  15. <FFF/>
  16. </DDD>
  17. </CCC>
  18. <CCC>
  19. <BBB>
  20. <BBB>
  21. <BBB/>
  22. </BBB>
  23. </BBB>
  24. </CCC>
  25. </AAA>

实例 4

方块号里的表达式可以进一步的指定元素, 其中数字表示元素在选择集里的位置, 而last()函数则表示选择集中的最后一个元素.

/AAA/BBB1

选择AAA的第一个BBB子元素

  1. <AAA>
  2. <BBB/>
  3. <BBB/>
  4. <BBB/>
  5. <BBB/>
  6. </AAA>

/AAA/BBB[last()]

选择AAA的最后一个BBB子元素

  1. <AAA>
  2. <BBB/>
  3. <BBB/>
  4. <BBB/>
  5. <BBB/>
  6. </AAA>

实例 5

//@id

选择所有的id属性

  1. <AAA>
  2. <BBB id = "b1"/>
  3. <BBB id = "b2"/>
  4. <BBB name = "bbb"/>
  5. <BBB/>
  6. </AAA>

//BBB[@id]

选择有id属性的BBB元素

  1. <AAA>
  2. <BBB id = "b1"/>
  3. <BBB id = "b2"/>
  4. <BBB name = "bbb"/>
  5. <BBB/>
  6. </AAA>

//BBB[@name]

选择有name属性的BBB元素

  1. <AAA>
  2. <BBB id = "b1"/>
  3. <BBB id = "b2"/>
  4. <BBB name = "bbb"/>
  5. <BBB/>
  6. </AAA>

//BBB[@*]

选择有任意属性的BBB元素

  1. <AAA>
  2. <BBB id = "b1"/>
  3. <BBB id = "b2"/>
  4. <BBB name = "bbb"/>
  5. <BBB/>
  6. </AAA>

//BBB[not(@*)]

选择没有属性的BBB元素

  1. <AAA>
  2. <BBB id = "b1"/>
  3. <BBB id = "b2"/>
  4. <BBB name = "bbb"/>
  5. <BBB/>
  6. </AAA>

实例 6

属性的值可以被用来作为选择的准则, normalize-space函数删除了前部和尾部的空格, 并且把连续的空格串替换为一个单一的空格

//BBB[@id='b1']

选择含有属性id且其值为'b1'的BBB元素

  1. <AAA>
  2. <BBB id = "b1"/>
  3. <BBB name = " bbb "/>
  4. <BBB name = "bbb"/>
  5. </AAA>

//BBB[@name='bbb']

选择含有属性name且其值为'bbb'的BBB元素

  1. <AAA>
  2. <BBB id = "b1"/>
  3. <BBB name = " bbb "/>
  4. <BBB name = "bbb"/>
  5. </AAA>

//BBB[normalize-space(@name)='bbb']

选择含有属性name且其值(在用normalize-space函数去掉前后空格后)为'bbb'的BBB元素

  1. <AAA>
  2. <BBB id = "b1"/>
  3. <BBB name = " bbb "/>
  4. <BBB name = "bbb"/>
  5. </AAA>

实例 7

count()函数可以计数所选元素的个数

//*[count(BBB)=2]

选择含有2个BBB子元素的元素

  1. <AAA>
  2. <CCC>
  3. <BBB/>
  4. <BBB/>
  5. <BBB/>
  6. </CCC>
  7. <DDD>
  8. <BBB/>
  9. <BBB/>
  10. </DDD>
  11. <EEE>
  12. <CCC/>
  13. <DDD/>
  14. </EEE>
  15. </AAA>

//[count()=2]

选择含有2个子元素的元素

  1. <AAA>
  2. <CCC>
  3. <BBB/>
  4. <BBB/>
  5. <BBB/>
  6. </CCC>
  7. <DDD>
  8. <BBB/>
  9. <BBB/>
  10. </DDD>
  11. <EEE>
  12. <CCC/>
  13. <DDD/>
  14. </EEE>
  15. </AAA>

//* [count(*)=3]

选择含有3个子元素的元素

  1. <AAA>
  2. <CCC>
  3. <BBB/>
  4. <BBB/>
  5. <BBB/>
  6. </CCC>
  7. <DDD>
  8. <BBB/>
  9. <BBB/>
  10. </DDD>
  11. <EEE>
  12. <CCC/>
  13. <DDD/>
  14. </EEE>
  15. </AAA>

实例 8

name()函数返回元素的名称, start-with()函数在该函数的第一个参数字符串是以第二个参数字符开始的情况返回true, contains()函数当其第一个字符串参数包含有第二个字符串参数时返回true.

//*[name()='BBB']

选择所有名称为BBB的元素(这里等价于//BBB)

  1. <AAA>
  2. <BCC>
  3. <BBB/>
  4. <BBB/>
  5. <BBB/>
  6. </BCC>
  7. <DDB>
  8. <BBB/>
  9. <BBB/>
  10. </DDB>
  11. <BEC>
  12. <CCC/>
  13. <DBD/>
  14. </BEC>
  15. </AAA>

//*[starts-with(name(),'B')]

选择所有名称以"B"起始的元素

  1. <AAA>
  2. <BCC>
  3. <BBB/>
  4. <BBB/>
  5. <BBB/>
  6. </BCC>
  7. <DDB>
  8. <BBB/>
  9. <BBB/>
  10. </DDB>
  11. <BEC>
  12. <CCC/>
  13. <DBD/>
  14. </BEC>
  15. </AAA>

//*[contains(name(),'C')]

选择所有名称包含"C"的元素

  1. <AAA>
  2. <BCC>
  3. <BBB/>
  4. <BBB/>
  5. <BBB/>
  6. </BCC>
  7. <DDB>
  8. <BBB/>
  9. <BBB/>
  10. </DDB>
  11. <BEC>
  12. <CCC/>
  13. <DBD/>
  14. </BEC>
  15. </AAA>

实例 10

多个路径可以用分隔符 | 合并在一起

//CCC | //BBB

选择所有的CCC和BBB元素

  1. <AAA>
  2. <BBB/>
  3. <CCC/>
  4. <DDD>
  5. <CCC/>
  6. </DDD>
  7. <EEE/>
  8. </AAA>

/AAA/EEE | //BBB

选择所有的BBB元素和所有是AAA的子元素的EEE元素

  1. <AAA>
  2. <BBB/>
  3. <CCC/>
  4. <DDD>
  5. <CCC/>
  6. </DDD>
  7. <EEE/>
  8. </AAA>

/AAA/EEE | //DDD/CCC | /AAA | //BBB

可以合并的路径数目没有限制

  1. <AAA>
  2. <BBB/>
  3. <CCC/>
  4. <DDD>
  5. <CCC/>
  6. </DDD>
  7. <EEE/>
  8. </AAA>

实例 11

child轴(axis)包含上下文节点的子元素, 作为默认的轴,可以忽略不写.

/AAA

等价于 /child::AAA

  1. <AAA>
  2. <BBB/>
  3. <CCC/>
  4. </AAA>

/child::AAA

等价于/AAA

  1. <AAA>
  2. <BBB/>
  3. <CCC/>
  4. </AAA>

/AAA/BBB

等价于/child::AAA/child::BBB

  1. <AAA>
  2. <BBB/>
  3. <CCC/>
  4. </AAA>

/child::AAA/child::BBB

等价于/AAA/BBB

  1. <AAA>
  2. <BBB/>
  3. <CCC/>
  4. </AAA>

/child::AAA/BBB

二者都可以被合并

  1. <AAA>
  2. <BBB/>
  3. <CCC/>
  4. </AAA>

实例 12

descendant (后代)轴包含上下文节点的后代,一个后代是指子节点或者子节点的子节点等等, 因此descendant轴不会包含属性和命名空间节点.

/descendant : : *

选择文档根元素的所有后代.即所有的元素被选择

  1. <AAA>
  2. <BBB>
  3. <DDD>
  4. <CCC>
  5. <DDD/>
  6. <EEE/>
  7. </CCC>
  8. </DDD>
  9. </BBB>
  10. <CCC>
  11. <DDD>
  12. <EEE>
  13. <DDD>
  14. <FFF/>
  15. </DDD>
  16. </EEE>
  17. </DDD>
  18. </CCC>
  19. </AAA>

/AAA/BBB/descendant : : *

选择/AAA/BBB的所有后代元素

  1. <AAA>
  2. <BBB>
  3. <DDD>
  4. <CCC>
  5. <DDD/>
  6. <EEE/>
  7. </CCC>
  8. </DDD>
  9. </BBB>
  10. <CCC>
  11. <DDD>
  12. <EEE>
  13. <DDD>
  14. <FFF/>
  15. </DDD>
  16. </EEE>
  17. </DDD>
  18. </CCC>
  19. </AAA>

//CCC/descendant : : *

选择在祖先元素中有CCC的所有元素

  1. <AAA>
  2. <BBB>
  3. <DDD>
  4. <CCC>
  5. <DDD/>
  6. <EEE/>
  7. </CCC>
  8. </DDD>
  9. </BBB>
  10. <CCC>
  11. <DDD>
  12. <EEE>
  13. <DDD>
  14. <FFF/>
  15. </DDD>
  16. </EEE>
  17. </DDD>
  18. </CCC>
  19. </AAA>

//CCC/descendant : : DDD

选择所有以CCC为祖先元素的DDD元素

  1. <AAA>
  2. <BBB>
  3. <DDD>
  4. <CCC>
  5. <DDD/>
  6. <EEE/>
  7. </CCC>
  8. </DDD>
  9. </BBB>
  10. <CCC>
  11. <DDD>
  12. <EEE>
  13. <DDD>
  14. <FFF/>
  15. </DDD>
  16. </EEE>
  17. </DDD>
  18. </CCC>
  19. </AAA>

实例 13

parent轴(axis)包含上下文节点的父节点, 如果有父节点的话

//DDD/parent: : *

选择DDD元素的所有父节点

  1. <AAA>
  2. <BBB>
  3. <DDD>
  4. <CCC>
  5. <DDD/>
  6. <EEE/>
  7. </CCC>
  8. </DDD>
  9. </BBB>
  10. <CCC>
  11. <DDD>
  12. <EEE>
  13. <DDD>
  14. <FFF/>
  15. </DDD>
  16. </EEE>
  17. </DDD>
  18. </CCC>
  19. </AAA>

实例 14

ancestor轴(axis)包含上下节点的祖先节点, 该祖先节点由其上下文节点的父节点以及父节点的父节点等等诸如此类的节点构成,所以ancestor轴总是包含有根节点,除非上下文节点就是根节点本身.

/AAA/BBB/DDD/CCC/EEE/ancestor : : *

选择一个绝对路径上的所有节点

  1. <AAA>
  2. <BBB>
  3. <DDD>
  4. <CCC>
  5. <DDD/>
  6. <EEE/>
  7. </CCC>
  8. </DDD>
  9. </BBB>
  10. <CCC>
  11. <DDD>
  12. <EEE>
  13. <DDD>
  14. <FFF/>
  15. </DDD>
  16. </EEE>
  17. </DDD>
  18. </CCC>
  19. </AAA>

//FFF/ancestor : : *

选择FFF元素的祖先节点

  1. <AAA>
  2. <BBB>
  3. <DDD>
  4. <CCC>
  5. <DDD/>
  6. <EEE/>
  7. </CCC>
  8. </DDD>
  9. </BBB>
  10. <CCC>
  11. <DDD>
  12. <EEE>
  13. <DDD>
  14. <FFF/>
  15. </DDD>
  16. </EEE>
  17. </DDD>
  18. </CCC>
  19. </AAA>

实例 15

following-sibling轴(axis)包含上下文节点之后的所有兄弟节点

/AAA/BBB/following-sibling : : *

  1. <AAA>
  2. <BBB>
  3. <CCC/>
  4. <DDD/>
  5. </BBB>
  6. <XXX>
  7. <DDD>
  8. <EEE/>
  9. <DDD/>
  10. <CCC/>
  11. <FFF/>
  12. <FFF>
  13. <GGG/>
  14. </FFF>
  15. </DDD>
  16. </XXX>
  17. <CCC>
  18. <DDD/>
  19. </CCC>
  20. </AAA>

//CCC/following-sibling: : *

  1. <AAA>
  2. <BBB>
  3. <CCC/>
  4. <DDD/>
  5. </BBB>
  6. <XXX>
  7. <DDD>
  8. <EEE/>
  9. <DDD/>
  10. <CCC/>
  11. <FFF/>
  12. <FFF>
  13. <GGG/>
  14. </FFF>
  15. </DDD>
  16. </XXX>
  17. <CCC>
  18. <DDD/>
  19. </CCC>
  20. </AAA>

实例 16

preceding-sibling 轴(axis)包含上下文节点之前的所有兄弟节点

/AAA/XXX/preceding-sibling : : *

  1. <AAA>
  2. <BBB>
  3. <CCC/>
  4. <DDD/>
  5. </BBB>
  6. <XXX>
  7. <DDD>
  8. <EEE/>
  9. <DDD/>
  10. <CCC/>
  11. <FFF/>
  12. <FFF>
  13. <GGG/>
  14. </FFF>
  15. </DDD>
  16. </XXX>
  17. <CCC>
  18. <DDD/>
  19. </CCC>
  20. </AAA>

//CCC/preceding-sibling : : *

  1. <AAA>
  2. <BBB>
  3. <CCC/>
  4. <DDD/>
  5. </BBB>
  6. <XXX>
  7. <DDD>
  8. <EEE/>
  9. <DDD/>
  10. <CCC/>
  11. <FFF/>
  12. <FFF>
  13. <GGG/>
  14. </FFF>
  15. </DDD>
  16. </XXX>
  17. <CCC>
  18. <DDD/>
  19. </CCC>
  20. </AAA>

实例 17

following轴(axis)包含同一文档中按文档顺序位于上下文节点之后的所有节点, 除了祖先节点,属性节点和命名空间节点

/AAA/XXX/following : : *

  1. <AAA>
  2. <BBB>
  3. <CCC/>
  4. <ZZZ>
  5. <DDD/>
  6. <DDD>
  7. <EEE/>
  8. </DDD>
  9. </ZZZ>
  10. <FFF>
  11. <GGG/>
  12. </FFF>
  13. </BBB>
  14. <XXX>
  15. <DDD>
  16. <EEE/>
  17. <DDD/>
  18. <CCC/>
  19. <FFF/>
  20. <FFF>
  21. <GGG/>
  22. </FFF>
  23. </DDD>
  24. </XXX>
  25. <CCC>
  26. <DDD/>
  27. </CCC>
  28. </AAA>

//ZZZ/following : : *

  1. <AAA>
  2. <BBB>
  3. <CCC/>
  4. <ZZZ>
  5. <DDD/>
  6. <DDD>
  7. <EEE/>
  8. </DDD>
  9. </ZZZ>
  10. <FFF>
  11. <GGG/>
  12. </FFF>
  13. </BBB>
  14. <XXX>
  15. <DDD>
  16. <EEE/>
  17. <DDD/>
  18. <CCC/>
  19. <FFF/>
  20. <FFF>
  21. <GGG/>
  22. </FFF>
  23. </DDD>
  24. </XXX>
  25. <CCC>
  26. <DDD/>
  27. </CCC>
  28. </AAA>

实例 18

preceding轴(axis)包含同一文档中按文档顺序位于上下文节点之前的所有节点, 除了祖先节点,属性节点和命名空间节点

/AAA/XXX/preceding: : *

  1. <AAA>
  2. <BBB>
  3. <CCC/>
  4. <ZZZ>
  5. <DDD/>
  6. </ZZZ>
  7. </BBB>
  8. <XXX>
  9. <DDD>
  10. <EEE/>
  11. <DDD/>
  12. <CCC/>
  13. <FFF/>
  14. <FFF>
  15. <GGG/>
  16. </FFF>
  17. </DDD>
  18. </XXX>
  19. <CCC>
  20. <DDD/>
  21. </CCC>
  22. </AAA>

//GGG/preceding : : *

  1. <AAA>
  2. <BBB>
  3. <CCC/>
  4. <ZZZ>
  5. <DDD/>
  6. </ZZZ>
  7. </BBB>
  8. <XXX>
  9. <DDD>
  10. <EEE/>
  11. <DDD/>
  12. <CCC/>
  13. <FFF/>
  14. <FFF>
  15. <GGG/>
  16. </FFF>
  17. </DDD>
  18. </XXX>
  19. <CCC>
  20. <DDD/>
  21. </CCC>
  22. </AAA>

实例 19

descendant-or-self 轴(axis)包含上下文节点本身和该节点的后代节点

/AAA/XXX/descendant-or-self : : *

  1. <AAA>
  2. <BBB>
  3. <CCC/>
  4. <ZZZ>
  5. <DDD/>
  6. </ZZZ>
  7. </BBB>
  8. <XXX>
  9. <DDD>
  10. <EEE/>
  11. <DDD/>
  12. <CCC/>
  13. <FFF/>
  14. <FFF>
  15. <GGG/>
  16. </FFF>
  17. </DDD>
  18. </XXX>
  19. <CCC>
  20. <DDD/>
  21. </CCC>
  22. </AAA>

//CCC/descendant-or-self : : *

  1. <AAA>
  2. <BBB>
  3. <CCC/>
  4. <ZZZ>
  5. <DDD/>
  6. </ZZZ>
  7. </BBB>
  8. <XXX>
  9. <DDD>
  10. <EEE/>
  11. <DDD/>
  12. <CCC/>
  13. <FFF/>
  14. <FFF>
  15. <GGG/>
  16. </FFF>
  17. </DDD>
  18. </XXX>
  19. <CCC>
  20. <DDD/>
  21. </CCC>
  22. </AAA>

实例 20

ancestor-or-self 轴(axis)包含上下文节点本身和该节点的祖先节点

/AAA/XXX/DDD/EEE/ancestor-or-self : : *

  1. <AAA>
  2. <BBB>
  3. <CCC/>
  4. <ZZZ>
  5. <DDD/>
  6. </ZZZ>
  7. </BBB>
  8. <XXX>
  9. <DDD>
  10. <EEE/>
  11. <DDD/>
  12. <CCC/>
  13. <FFF/>
  14. <FFF>
  15. <GGG/>
  16. </FFF>
  17. </DDD>
  18. </XXX>
  19. <CCC>
  20. <DDD/>
  21. </CCC>
  22. </AAA>

//GGG/ancestor-or-self : : *

  1. <AAA>
  2. <BBB>
  3. <CCC/>
  4. <ZZZ>
  5. <DDD/>
  6. </ZZZ>
  7. </BBB>
  8. <XXX>
  9. <DDD>
  10. <EEE/>
  11. <DDD/>
  12. <CCC/>
  13. <FFF/>
  14. <FFF>
  15. <GGG/>
  16. </FFF>
  17. </DDD>
  18. </XXX>
  19. <CCC>
  20. <DDD/>
  21. </CCC>
  22. </AAA>

实例 21

ancestor, descendant, following, preceding 和self轴(axis)分割了XML文档(忽略属性节点和命名空间节点), 不能交迭, 而一起使用则包含所有节点

//GGG/ancestor : : *

  1. <AAA>
  2. <BBB>
  3. <CCC/>
  4. <ZZZ/>
  5. </BBB>
  6. <XXX>
  7. <DDD>
  8. <EEE/>
  9. <FFF>
  10. <HHH/>
  11. <GGG>
  12. <JJJ>
  13. <QQQ/>
  14. </JJJ>
  15. <JJJ/>
  16. </GGG>
  17. <HHH/>
  18. </FFF>
  19. </DDD>
  20. </XXX>
  21. <CCC>
  22. <DDD/>
  23. </CCC>
  24. </AAA>

//GGG/descendant: : *

  1. <AAA>
  2. <BBB>
  3. <CCC/>
  4. <ZZZ/>
  5. </BBB>
  6. <XXX>
  7. <DDD>
  8. <EEE/>
  9. <FFF>
  10. <HHH/>
  11. <GGG>
  12. <JJJ>
  13. <QQQ/>
  14. </JJJ>
  15. <JJJ/>
  16. </GGG>
  17. <HHH/>
  18. </FFF>
  19. </DDD>
  20. </XXX>
  21. <CCC>
  22. <DDD/>
  23. </CCC>
  24. </AAA>

//GGG/following:: *

  1. <AAA>
  2. <BBB>
  3. <CCC/>
  4. <ZZZ/>
  5. </BBB>
  6. <XXX>
  7. <DDD>
  8. <EEE/>
  9. <FFF>
  10. <HHH/>
  11. <GGG>
  12. <JJJ>
  13. <QQQ/>
  14. </JJJ>
  15. <JJJ/>
  16. </GGG>
  17. <HHH/>
  18. </FFF>
  19. </DDD>
  20. </XXX>
  21. <CCC>
  22. <DDD/>
  23. </CCC>
  24. </AAA>

//GGG/preceding:: *

  1. <AAA>
  2. <BBB>
  3. <CCC/>
  4. <ZZZ/>
  5. </BBB>
  6. <XXX>
  7. <DDD>
  8. <EEE/>
  9. <FFF>
  10. <HHH/>
  11. <GGG>
  12. <JJJ>
  13. <QQQ/>
  14. </JJJ>
  15. <JJJ/>
  16. </GGG>
  17. <HHH/>
  18. </FFF>
  19. </DDD>
  20. </XXX>
  21. <CCC>
  22. <DDD/>
  23. </CCC>
  24. </AAA>

//GGG/self:: *

  1. <AAA>
  2. <BBB>
  3. <CCC/>
  4. <ZZZ/>
  5. </BBB>
  6. <XXX>
  7. <DDD>
  8. <EEE/>
  9. <FFF>
  10. <HHH/>
  11. <GGG>
  12. <JJJ>
  13. <QQQ/>
  14. </JJJ>
  15. <JJJ/>
  16. </GGG>
  17. <HHH/>
  18. </FFF>
  19. </DDD>
  20. </XXX>
  21. <CCC>
  22. <DDD/>
  23. </CCC>
  24. </AAA>

//GGG/ancestor:: * | //GGG/descendant:: * | //GGG/following:: * | //GGG/preceding:: * | //GGG/self:: *

  1. <AAA>
  2. <BBB>
  3. <CCC/>
  4. <ZZZ/>
  5. </BBB>
  6. <XXX>
  7. <DDD>
  8. <EEE/>
  9. <FFF>
  10. <HHH/>
  11. <GGG>
  12. <JJJ>
  13. <QQQ/>
  14. </JJJ>
  15. <JJJ/>
  16. </GGG>
  17. <HHH/>
  18. </FFF>
  19. </DDD>
  20. </XXX>
  21. <CCC>
  22. <DDD/>
  23. </CCC>
  24. </AAA>

实例 22

div运算符做浮点除法运算, mod运算符做求余运算, floor函数返回不大于参数的最大整数(趋近于正无穷), ceiling返回不小于参数的最小整数(趋近于负无穷)

//BBB[position() mod 2 = 0 ]

选择偶数位置的BBB元素

  1. <AAA>
  2. <BBB/>
  3. <BBB/>
  4. <BBB/>
  5. <BBB/>
  6. <BBB/>
  7. <BBB/>
  8. <BBB/>
  9. <BBB/>
  10. <CCC/>
  11. <CCC/>
  12. <CCC/>
  13. </AAA>

//BBB[ position() = floor(last() div 2 + 0.5) or position() = ceiling(last() div 2 + 0.5) ]

选择中间的BBB元素

  1. <AAA>
  2. <BBB/>
  3. <BBB/>
  4. <BBB/>
  5. <BBB/>
  6. <BBB/>
  7. <BBB/>
  8. <BBB/>
  9. <BBB/>
  10. <CCC/>
  11. <CCC/>
  12. <CCC/>
  13. </AAA>

//CCC[ position() = floor(last() div 2 + 0.5) or position() = ceiling(last() div 2 + 0.5) ]

选择中间的CCC元素

  1. <AAA>
  2. <BBB/>
  3. <BBB/>
  4. <BBB/>
  5. <BBB/>
  6. <BBB/>
  7. <BBB/>
  8. <BBB/>
  9. <BBB/>
  10. <CCC/>
  11. <CCC/>
  12. <CCC/>
  13. </AAA>

xpath技术,用在dom4j中的更多相关文章

  1. dom4j解析器 基于dom4j的xpath技术 简单工厂设计模式 分层结构设计思想 SAX解析器 DOM编程

    *1 dom4j解析器   1)CRUD的含义:CreateReadUpdateDelete增删查改   2)XML解析器有二类,分别是DOM和SAX(simple Api for xml).     ...

  2. Java xml 操作(Dom4J修改xml   + xPath技术  + SAX解析 + XML约束)

    1 XML基础 1)XML的作用 1.1 作为软件配置文件 1.2 作为小型的"数据库" 2)XML语法(由w3c组织规定的) 标签: 标签名不能以数字开头,中间不能有空格,区分大 ...

  3. 打造完美的xml技术解决方案(dom4j/xstream)

    转: XML 技术是随着 Java 的发展而发展起来的.在 XML 出现之前对于简单的数据格式通常是存储在 ini 配置文件等文本文件中,复杂的格式则采用自定义的文件格式,因此对于每种文件格式都要有专 ...

  4. xPath技术

    在dom4j中如何使用xPath技术 1)导入xPath支持jar包 . jaxen-1.1-beta-6.jar 2)使用xpath方法 List<Node> selectNodes(& ...

  5. xpath技术解析xml以及案例模拟用户登录效果

    问题:当使用dom4j查询比较深的层次结构的节点(标签,属性,文本),比较麻烦!!! xpath就在此情况下产生了--主要是用于快速获取所需的[节点对象]. 在dom4j中如何使用xPath技术 1) ...

  6. Java修炼——XPATH 技术_快速获取节点

    准备资源 1) DOM4J 的 jar 包 2) Jaxen 的 jar 包 3) XPATH中文文档 XPATH技术是为了将获取结点变得更简单,更方便而设计的.是在DOM4J的基础上完成的.因此需要 ...

  7. Day 27:Xpath技术

    xPath技术 问题:当使用dom4j查询比较深的层次结构的节点(标签,属性,文本),比较麻烦!!! xPath作用 主要是用于快速获取所需的节点对象. 在dom4j中如何使用xPath技术 1.导入 ...

  8. XML:使用DOM技术解析xML文件中的城市,实现select级联选择

    中国的城市xml格式:cities.xml <?xml version="1.0" encoding="utf-8"?> <china> ...

  9. PHP 自学之路-----XML编程(Xpath技术,simpleXml技术)基础入门

    XPAth技术 XPath的设计的核心思想,可以通过xpath迅速简介的定位到你希望查找的节点.主要目的是描述节点相对其他节点的位置,可以取得所有符合条件的节点,成为[位置路径]. Xapth主要用来 ...

随机推荐

  1. python学习(五)列表

    #!/usr/bin/python # 列表的学习, 列表的概念不陌生, 就是熟悉一下python中的列表是如何操作的 # 1. 序列的操作 L = [ 123, 'spam', 1.23] # 里面 ...

  2. ios --转载 使用SMSSDK实现短信验证:

    1.先到http://www.mob.com/#/网站注册账号,然后下载最新的sdk(有Android和iOS两个版本,根据需要进行下载) 2.进入到后台选择SecurityCodeSDk(支持全球短 ...

  3. win本地配置docker环境

    先上官网链接:https://docs.docker.com/get-started/part2/#introduction 优质入门教程:http://www.docker.org.cn/book/ ...

  4. python 基础 8.2 编译正则对象

    #/usr/bin/python #coding=utf-8 #@Time   :2017/11/14 9:55 #@Auther :liuzhenchuan #@File   :编译正则对象.py ...

  5. npm ERR! fatal: unable to connect to github.com

    https://blog.csdn.net/baidu_30809315/article/details/86520093 git config --global url."https:// ...

  6. 设计模式系列一创建型模式之(简单工厂VS工厂方法)

    1.简单工厂简介 诞生背景:在我们平常编程当中,经常会使用new进行实例化一个对象,此时该类完全依赖于该对象,专业术语来说就是耦合度高.当需求发生变化时我们不得不去修改此类的源码,造成整个系统难以维护 ...

  7. NHibernate学习系列一

    NHibernate是一个面向.NET环境的对象/关系数据库映射工具.对象/关系数据库映射(object/relational mapping,ORM)这个术语表示一种技术,用来把对象模型表示的对象映 ...

  8. SCRM从入门到精通01

    [SCRM从入门到精通01]如何基于微信开放接口开发企业的微信CRM? 业内一直都在传说微信是天生的CRM,可是没有人看到过微信CRM的真容.随着微信最新公众平台的改版和开放接口的微信认证开放,微信C ...

  9. SQL Server里的 ISNULL 与 NULLIF(转)

    SQL Server 中有两个参数,语法:     ISNULL(check_expression, replacement_value) check_expression 与 replacement ...

  10. iOS 流布局 UICollectionView使用(简单使用)

    简介 UICollectionView是iOS6之后引入的一个新的UI控件,它和UITableView有着诸多的相似之处,其中许多代理方法都十分类似.简单来说,UICollectionView是比UI ...