XPath
XPath即为XML路径语言(XML Path Language),它是一种用来确定XML文档中某部分位置的语言。
简介[ ]
XPath 是一门在 XML 文档中查找信息的语言。XPath 用于在 XML 文档中通过元素和属性进行导航。
什么是 XPath?
- XPath 使用路径表达式在 XML 文档中进行导航
- XPath 包含一个标准函数库
- XPath 是 XSLT 中的主要元素
- XPath 是一个 W3C 标准
XPath 表示法[ ]
最常见的XPath表达式是路径表达式(XPath这一名称的另一来源)。路径表达式是从一个XML节点(当前的上下文节点)到另一个节点、或一组节点的书面步骤顺序。这些步骤以“/”字符分开,每一步有三个构成成分:
- 轴描述(用最直接的方式接近目标节点)
- 节点测试(用于筛选节点位置和名称)
- 节点描述(用于筛选节点的属性和子节点特征)
一般情况下,我们使用简写后的语法。虽然完整的轴描述是一种更加贴近人类语言,利用自然语言的单词和语法来书写的描述方式,但是相比之下也更加罗嗦。
简写后的语法最简单的XPath如下:
- /A/B/C
在这里选择所有符合规矩的C节点:C节点必须是B的子节点(B/C),同时B节点必须是A的子节点(A/B),而A是这个XML文档的根节点(/A)。此时的这种描述法类似于磁盘中文件的路径(URI),从盘符开始顺着一级一级的目录最终找到文件。
这里还有一个复杂一些的例子,包含了全部构成成分(请详细的看):
- A//B/*[1]
此时选择的元素是:在B节点下的第一个节点(B/*[1]),不论节点的名称如何(*);而B节点必须出现在A节点内,不论和A节点之间相隔几层节点(//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()。
XPath 标准函数[ ]
XPath 含有超过 100 个内建的函数。这些函数用于字符串值、数值,日期和时间比较、节点和 QName 处理、序列处理、逻辑值等等。
XPath 节点[ ]
在 XPath 中,有七种类型的节点:元素、属性、文本、命名空间、处理指令、注释以及文档节点(或称为根节点)。
XPath 术语
节点(Node)
在 XPath 中,有七种类型的节点:元素、属性、文本、命名空间、处理指令、注释以及文档(根)节点。XML 文档是被作为节点树来对待的。树的根被称为文档节点或者根节点。
XPath存取函数[ ]
名称 说明
fn:node-name(node) 返回参数节点的节点名称。
fn:nilled(node) 返回是否拒绝参数节点的布尔值。
fn:data(item.item,...) 接受项目序列,并返回原子值序列。
fn:base-uri()
fn:base-uri(node)
返回当前节点或指定节点的 base-uri 属性的值。
fn:document-uri(node) 返回指定节点的 document-uri 属性的值。
函数与运算符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()
XPath 2.0[ ]
在W3C建议下,XPath 1.0于1999年11月16日发表。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表达式。