XPath学习 ( by quqi99 )

来源:互联网 发布:淘宝运营简历 编辑:程序博客网 时间:2024/04/29 12:36


                                                       XPath学习 ( by quqi99 )

 


作者:张华 发表于:2008-03-12  ( http://blog.csdn.net/quqi99 )

版权声明:可以任意转载,转载时请务必以超链接形式标明文章原始出处和作者信息及本版权声明。

 

 

 

     XPath即为XML路径语言(XML Path Language),它是一种用来确定XML文档中某部分位置的语言。

原本XPath动机于提供一种通用的、介于XPointer与XSL间语法行为模型的渴望。XPath很快的被开发者采用来当作小型查询语言。

标记法 最常见的XPath表达式(同样是该语言赢得这个称号的由来)是路径表示式。路径表示式是从一个XML节点(现行" 上下文节点")到另一个节点、或一组节点的书面步骤顺序。这些步骤以"/"(例:路径)字符分开。每一步有三个构成要素:

座标描述元 节点测试 述语(Predicate) 两个标记法被定义,最后一个:简写语法,更为简要,并允许XPath便于靠直觉和,在许多情况下,利用常见的字符和构造式来书写阅读。完整语法是比较啰唆,不过它允许更多选项被指定,而且如果小心阅读的话它更具描述性。


简写语法 简洁标记法允许对常见的实例使用许多缺省与简写。最简单的XPath记录形式如:

/A/B/C 在这里选择C元素是B的子元素、B元素是A的子元素,A元素形成XML 文件的最外层。XPath语法设计来模拟URI(一致性资源识别码)以及档案路径的语法。

更复杂的表达式可建立以三种方式:利用给定非缺省'child'座标、或者其他非简单的名称的节点测试、或者可纪录在任何步骤后方包括号内的术语。例如,表达式:

A//B/*[1] 选择第一个元素('[1]')不管他的名字是什么('*'),是B元素的子元素('/'),而B元素本身是A的子元素或者其他更深的后裔('//')。A元素是现行背景点(表达式不以'/'为开始)。


延展语法 在完全的、未缩写语法里,两个上述范例可以写为:

/child::A/child::B/child::C child::A/descendant-or-self::B/child::node()[1] 在这里,于XPath每个步骤里,座标(例如:child或descendant-or-self)是明确的指定,跟随著::然后是节点测试,例如上面范例所示的A或node()。


座标描述元 座标描述元表示XML文件分支树表达式的浏览方向。这些座标──以全名然后缩写语法──列举如下:

child (子) 缺省,不需要缩写语法声明 attribute (属性) @ descendant (后裔) 缩写语法不提供 descendant-or-self (后裔或自己) // parent (父母) .. 例如:点点 ancestor (先人) 缩写语法不提供 ancestor-or-self (先人或自己) 缩写语法不提供 following (追随者) 缩写语法不提供 preceding (前者) 缩写语法不提供 following-sibling (追随的兄弟姊妹) 缩写语法不提供 preceding-sibling (前者的兄弟姊妹) 缩写语法不提供 self (自己) . 例如:点 namespace (名称空间) 缩写语法不提供 关于使用attribute座标简写语法的一个范例, //a/@href 在文件树里任何地方的元素下选择了一个叫href的属性。self座标最通常与述语同用,以参考现行选定节点。例如,h3[.='See also']在现行上下文选取了叫h3的元素,该元素文字内容是See also。


节点测试 节点测试包括特定节点名或者更一般的表达式。至于XML里命名空间字首gs已定义的文件,//gs:enquiry将找到所有在那命名空间里enquiry的节点。

其他节点格式:

comment() 寻找XML注释节点,例如 text() 寻找某点的文字型别,例如hello于<k>hello</k> processing-instruction() 寻找XML处理指令如<?php echo $a; ?>。在这个例子里,将符合processing-instruction('php')会传回值。 node() 寻找所有点

述语(Predicates) 任何特异错综性表达式可在方括号里表示,这条件必须在XPath处理先前节点之前先被满足。范例包括: //a[@href='help.php'], 这将比较 a 元素有没有 href 属性,并且该值是 help.php。

在某一步骤可有多少个述语并没有限制,而且它们不必要被限制在一条XPath语句的最后步骤。它们也可以套叠至任何深度。以述语描述的路径开始于现行步骤的背景而且并不修改该背景。

//a[@href='help.php'][../div/@class='header']/@target 将会选择 a 元素的 target 属性值, 在这例子里 a 元素有 href 属性且值为 help.php, 以及 a 元素有父辈 div 元素,其本身有 class 属性,值为 header。


函式与操作子 XPath 1.0定义四种资料型别:节点组(本身无序的节点组)、字串、数字、与布林。

有效操作子有:

"/", "//" 以及 "[...]"操作子,惯用于路径表达式,如上所述。 联集操作子 "|"为两个节点形成联集。 布林操作子 "and","or",以及函数"not()" 算数操作子 "+","-","*","div"(除),以及"mod"(余数) 比较操作子 "=", "!=", "<", ">", "<=", ">=" 函式馆包括:

操作字串函式: concat(), substring(), contains(), substring-before(), substring-after(), translate(), normalize-space(), string-length() 操作数字函式: sum(), round(), floor(), ceiling() 节点属性取得函式: name(), local-name(), namespace-uri() 处理上下文资讯取得函式: position(), last() 型别转换函式: string(), number(), boolean() 某些常用的函式详列如下。完整明细请参照W3C建议书。


节点组函式 position() 返回符合XPath到该点间一组内,根据比较它的兄弟点而得的,代表该节点位置数。 count(node-set) 返回符合XPath指定于参数的一组节点。

字串函式 string(object?) 根据内建法则转换任何四种XPath资料型别为字串。参数可为XPath,在这里符合条件节点(群)转换成返回字串。 concat(string, string, string*) 连结任何数量字串。 contains(s1, s2) 如果s1包含s2返回真。 normalize-space(string?) 所有带头和结尾的空白字符都被移除,且大于两个以上的空白字符会被置换成单一空白。这对对付原本XML因打印关系被美化──这可能让后来的字串处理不可靠──这种情况时相当有用。

布林函式 not(boolean) 布林函式相反化.

数函式 sum(node-set) 根据内建转型规则,转换所有XPath参数定义找到的节点字串值成为数字,然后返回这些数字总合 使用操作子:=, !=, <=, <, >= 和 >的表达式可以创造于术语内。布林表达式可用括号()、布林操作子and与or、和/或者上述的not()函式联合起来。数值计算使用*, +, -, div和mod。字串可包含任何Unicode字符。

述语内外,整个节点组可利用"|"字符联合起来。

v[x or y] | w[z] 会返回单一节点组,包括现行上下文找到的所有拥有x或y子元素的v 元素、有z子元素的w元素。

//item[@price > 2*@discount] 会选取price属性至少两倍于discount属性数值的物件


XPath 2.0 在W3C建议下,XPath 1.0于1999年十一月十六号发表。XPath 2.0目前正在W3C审核过程的最终阶段。XPath 2.0表达了XPath语言在大小与能力上显著的增加。

最值得大书特书的改变是XPath 2.0有了更丰富的型别系统;XPath 2.0支援不可分割型态,如在XML Schema内建型态定义一样,并且也可自纲要(schema)导入用户自定型别。现在每个值都是一个序列(一个单一不可分割值或节点都被视为长度一的序 列)。XPath 1.0节点组被节点序列取代,它可以是任何顺序。

为了支援更丰富的型别组,XPath 2.0提供相当延展的函式与操作子群。

XPath 2.0实际上是XQuery 1.0的子集合。它提供了一个for表达式。该式是XQuery里"FLWOR"表达式的缩减版。利用列出XQuery省去的部分来描述该语言是可能的。 主要范例是查询前导语(query prolog)、元素和属性建构式、"FLWOR"语法的余项式、以及typeswitch表达式。

 
原创粉丝点击