XPath基本概念(二)
XPath的路径说明是比较简单的,最基本的是路径匹配。很像文件路径的表达方式。路径匹配的符号有:
"/"选择根结点或是表示路径。比如“/A/B/C”表示匹配A结点的孙节点C
"//"匹配子元素。比如:“A”匹配所有A元素,“//A/B”匹配A中的所有B元素
"*"通配符。表示所有元素。比如“/A/*”匹配A节点的所有子节点。
"|"或运算,表示路径的“或”运算。比如“//A|//B”表示所有A和B元素
仅仅有路径说明是不够的,下面加入关于位置的规定:
[1]选择第一个元素
[last()]选择最后一个元素
[number]按照指定数字的确定位置。/booklist/book[3],匹配looklist中第三个book元素
[position()=number]由数字指定第几个位置的元素
[position()>number]匹配所有位置号大于等于指定数字的元素
现在我们来看看,加入对匹配属性的要求。这样,对数据内容的要求就比较完整了。对属性的匹配要求主要是通过“@”运算符来完成的。
[@id]匹配具有属性“id”的元素
[@name]匹配具有属性名“name”的元素
[@*]匹配有属性的元素
[not(@*)]匹配没有属性的元素
[@id="name"]匹配有属性“id”为“name”的元素
XPath还提供类似于亲属关系的匹配方式。每个节点都有祖先节点、父节点、兄弟节点、子节点、后继节点。
child关键字匹配子元素。像"child::A"匹配子元素节点"A","child::*"匹配所有子元素节点,"child::text()"匹配所有文本子节点,"child::node()"匹配所有子节点,包括所有类型。
descendant关键字匹配后继节点。"descendant::para"匹配后继节点"para","descendant::*"匹配所有后继节点,不包括当前节点。"descendant-or-self::*"属性匹配所有后继节点和当前节点。
还有"ancestor,foollow,self,parent"等关键字,使用方法举例说明如下:
ancestor-or-self::para匹配para的祖先,如果当前节点是para。匹配结果包括当前节点。
ancestor::para匹配所有para的祖先。
self::para所有para自身元素。
follow-sibling::*匹配所有后面紧邻的兄弟元素节点。
follow::*匹配所有后续节点。
preceding-sibling::book[position()=1]匹配book的前一个兄弟节点。
对于属性,使用关键字“attribute”。比如"attribute::*"匹配所有属性节点。“attribute::name”匹配属性“name”指定的属性节点。
下面看几个综合的例子:
child::chapter/descendant::para
匹配当前节点的"chapter"子节点的"para"后继节点。
child::para[position()=last()-1]
匹配位于倒数第二个"para"子元素。
/child::doc/child::chapter[position()=5]/child::section[position()=2]
匹配"doc"节点的子节点——第5章(chapter)第2节(section)。
child::*[self::chapter or self::appendix]
匹配当前节点的"chapter"子元素和"appendix"子元素。
child::para[position()=5][attribute::type="warning"]
当当前节点的第5个"para"子节点具有值为"warning"的属性"type",那么匹配这个子节点。
"/"选择根结点或是表示路径。比如“/A/B/C”表示匹配A结点的孙节点C
"//"匹配子元素。比如:“A”匹配所有A元素,“//A/B”匹配A中的所有B元素
"*"通配符。表示所有元素。比如“/A/*”匹配A节点的所有子节点。
"|"或运算,表示路径的“或”运算。比如“//A|//B”表示所有A和B元素
仅仅有路径说明是不够的,下面加入关于位置的规定:
[1]选择第一个元素
[last()]选择最后一个元素
[number]按照指定数字的确定位置。/booklist/book[3],匹配looklist中第三个book元素
[position()=number]由数字指定第几个位置的元素
[position()>number]匹配所有位置号大于等于指定数字的元素
现在我们来看看,加入对匹配属性的要求。这样,对数据内容的要求就比较完整了。对属性的匹配要求主要是通过“@”运算符来完成的。
[@id]匹配具有属性“id”的元素
[@name]匹配具有属性名“name”的元素
[@*]匹配有属性的元素
[not(@*)]匹配没有属性的元素
[@id="name"]匹配有属性“id”为“name”的元素
XPath还提供类似于亲属关系的匹配方式。每个节点都有祖先节点、父节点、兄弟节点、子节点、后继节点。
child关键字匹配子元素。像"child::A"匹配子元素节点"A","child::*"匹配所有子元素节点,"child::text()"匹配所有文本子节点,"child::node()"匹配所有子节点,包括所有类型。
descendant关键字匹配后继节点。"descendant::para"匹配后继节点"para","descendant::*"匹配所有后继节点,不包括当前节点。"descendant-or-self::*"属性匹配所有后继节点和当前节点。
还有"ancestor,foollow,self,parent"等关键字,使用方法举例说明如下:
ancestor-or-self::para匹配para的祖先,如果当前节点是para。匹配结果包括当前节点。
ancestor::para匹配所有para的祖先。
self::para所有para自身元素。
follow-sibling::*匹配所有后面紧邻的兄弟元素节点。
follow::*匹配所有后续节点。
preceding-sibling::book[position()=1]匹配book的前一个兄弟节点。
对于属性,使用关键字“attribute”。比如"attribute::*"匹配所有属性节点。“attribute::name”匹配属性“name”指定的属性节点。
下面看几个综合的例子:
child::chapter/descendant::para
匹配当前节点的"chapter"子节点的"para"后继节点。
child::para[position()=last()-1]
匹配位于倒数第二个"para"子元素。
/child::doc/child::chapter[position()=5]/child::section[position()=2]
匹配"doc"节点的子节点——第5章(chapter)第2节(section)。
child::*[self::chapter or self::appendix]
匹配当前节点的"chapter"子元素和"appendix"子元素。
child::para[position()=5][attribute::type="warning"]
当当前节点的第5个"para"子节点具有值为"warning"的属性"type",那么匹配这个子节点。