XPath

XPath节点

<?xml version="1.0" encoding="ISO-8859-1"?>
<classroom>
    <student>
          <id>100</id>
          <name lang="en">jack</name>
          <age>20</age>
    </student>
</classroom>

其中,<classroom>是文档节点, <id>100</id>是元素节点,lang="en"是属性节点,jack是文本
节点间关系包括父(Parent),子(Children),同胞(Sibling),先辈(Ancestor),后代(Descendant)。如student元素是id,name,age的父。

XPath语法

使用路径表达式来选取节点或节点集。

表达式 描述
nodename 选取此节点的所有子节点
/ 从根节点选取
// 选择任意位置的某个节点
. 选取当前节点
.. 选取当前节点的父节点
@ 选取属性

如:

<?xml version="1.0" encoding="ISO-8859-1"?>
<classroom>
    <student>
          <id>100</id>
          <name lang="en">jack</name>
          <age>20</age>
    </student>
    <student>
          <id>101</id>
          <name lang="en">tom</name>
          <age>21</age>
    </student>
</classroom>
  • 选取classroom的所有子节点 classroom
  • 选取根元素classroom /classroom
  • 选取属于classroom的子元素的所有student元素 classroom/student
  • 选取所有student子元素,而不管它们在文档中的位置
    //student
  • 选取属于classroom的子元素的所有student元素 ,而不管它们在classroom下的什么位置classroom//student
  • 选取名为lang的所有属性 //@lang
    以上是用来选取所有符合条件的节点。
    而若要选取某个特定的节点,则需要用到谓语(嵌在方括号里)。
  • 选取属于classroom子元素的第一个student元素/classroom/student[1]
  • 选取属于classroom子元素的最后一个student元素/calssroom/student[last()]
  • 选取属于classroom子元素的倒数第二个student元素/calssroom/student[last()-1]
  • 选取最前面的两个属于classroom元素的子元素的student元素/calssroom/student[position()<3]
  • 选取所有拥有名为lang的属性的name元素//name[@lang]
  • 选取所有name元素,且这些元素拥有值为eng的lang属性//name[@lang='eng']
  • 选取classroom元素的所有student元素,且其中的age元素的值大于20 /classroom/student[age>20]
  • 选取classroom元素的所有子元素/classroom/*
  • 选取所有带有属性的name元素//name[@*]
  • 选取student元素的所有name和age元素 //student/name | //student/age

XPath轴

轴定义了所选节点与当前节点间的树关系。若首先提取到一个节点信息,然后想在这个节点的基础上提取它的子节点或者父节点,就可以用到这个概念。

  1. 绝对路径:起始于正斜杠(/),如/step/step/...
  2. 相对路径:step/step/...
    首先提出一个“步”的概念:轴名称::节点测试[谓语]。
  • 选取当前classroom节点中子元素的student节点 /classroom/child::student
    *选取/classroom/student/name节点下的所有属性/classroom/student/name/attribute::*

XPath运算符

如:

  • 除 : /classroom/student[age = 40 div 2],类似,加减乘分别为+ - *
  • 与 : /classroom/student[age > 20 and age < 25],类似,“或”为and
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容