XPath

XPath
编程范型查询语言
實作者W3C
发行时间1998年,​26年前​(1998
当前版本
  • 3.1 (2017年3月21日;W3C推荐标准)[1]
編輯維基數據鏈接
啟發語言
XSLT, XPointer英语XPointer
影響語言
XML Schema, XForms

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

XPath基于XML的树状结构,提供在数据结构树中找寻节点的能力[2][3]。起初XPath的提出的初衷是将其作为一个通用的、介于XPointer英语XPointer与XSL间的语法模型。但是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的每个步骤裡,通过完整的轴描述(例如:childdescendant-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

如果需要了解更多,请查看ZVON.org给出的XPath帮助 (页面存档备份,存于互联网档案馆

节点测试

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

其他节点格式:

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

节点描述

节点描述为一个逻辑真假表达式,任何真假判断表达式都可在节点后方括号里表示,这条件必须在XPath处理这个节点前先被满足。在某一步骤可有多少个描述并没有限制。

范例如下: //a[@href='help.php'],这将检查元素a有没有href属性,并且该它的值是help.php

复杂一些的范例如下:

  • //a[@href='help.php'][../div/@class='header']/@target

  • //a[@href='help.php'][name(..)='div'][../@class='header']/@target

此例将会选择符合条件的元素atarget属性。 要求元素a

  • 具有属性href且值为help.php
  • 并且元素a具有父元素div
  • 并且父元素(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()
返回当前节点集合内,该节点的位置。
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参数定义找到的节点字符串值成为数字,然后返回这些数字总合

使用操作子:=, !=, <=, <, >=>的表达式可以创造于术语内。布尔表达式可用括号()、布尔操作子andor、和/或者上述的not()函式联合起来。数值计算使用*, +, -, divmod。字符串可包含任何Unicode字符。

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

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

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

XPath 2及XPath 3

在W3C建议下[4],XPath 1.0于1999年11月16日发表。XPath 2.0于2007年1月23日成为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表达式。

XPath 3.0於2014年4月8日成為W3C推薦標準,而XPath3.1則於2017年3月21日成為W3C推薦標準。

参看

引用

  1. ^ https://www.w3.org/TR/xpath-31/.
  2. ^ Bergeron, Randy. XPath—Retrieving Nodes from an XML Document. SQL Server Magazine. October 31, 2000 [February 24, 2011]. (原始内容存档于July 26, 2010). 
  3. ^ Pierre Geneves. Course: The XPath Language (PDF). October 2012 [2021-03-15]. (原始内容 (PDF)存档于2021-04-14). 
  4. ^ XML and Semantic Web W3C Standards Timeline (PDF). 2012-02-04 [2021-03-15]. (原始内容 (PDF)存档于2013-04-24). 

外部链接

  • W3C XPath1.0规范(英文)
  • W3C XPath 2.0候选推荐(页面存档备份,存于互联网档案馆(英文)


通用的
  • .QL英语.QL
  • Alpha英语Alpha (programming language)
  • CQL英语Contextual Query Language
  • Cypher英语Cypher (query language)
  • D英语D (data language specification)
  • DMX英语Data Mining Extensions
  • Datalog
  • GraphQL
  • ISBL英语ISBL
  • LDAP
  • LINQ
  • MQL
  • MDX英语MultiDimensional eXpressions
  • OQL英语Object Query Language
  • OCL英语Object Constraint Language
  • QUEL英语QUEL query languages
  • SMARTS
  • SPARQL
  • SQL
  • XQuery英语XQuery
  • XPath
专有的
被取代
  • CODASYL英语CODASYL
產品及
標準
推薦
记录
  • IndieAuth英语IndieAuth
  • XAdES英语XAdES
  • XHTML+SMIL英语XHTML+SMIL
  • XUP
工作草案
  • CCXML英语Call Control eXtensible Markup Language
  • CURIE英语CURIE
  • EME
  • InkML
  • JSON-LD
  • MSE
  • RIF
  • SCXML英语SCXML
  • SMIL時間表英语SMIL Timesheets
  • sXBL英语sXBL
  • WICD英语Web Integration Compound Document
  • XFDL英语Extensible Forms Description Language
  • XFrames英语XFrames
  • XBL
  • XMLHttpRequest
檢測
倡議
  • 多通道交互活動(MMI)英语W3C MMI
  • 驗証服務
  • 無障礙網頁倡議英语Web Accessibility Initiative
  • 網絡平台英语WebPlatform
棄用
  • C-HTML
  • HDML英语Handheld Device Markup Language
  • JSSS英语JavaScript Style Sheets
  • PGML英语Precision Graphics Markup Language
  • VML
  • XHTML+MathML+SVG英语XHTML+MathML+SVG
機構
  • 萬維網基金會英语World Wide Web Foundation
工作小組
  • SVG英语SVG Working Group
  • CSS英语CSS Working Group
  • HTML英语HTML Working Group
  • WebOnt(語義網活動)英语WebOnt
  • 設備描述(DDWG)英语W3C Device Description Working Group
  • 網頁超文本技術工作小組(WHATWG)
軟件
瀏覽器
  • Line Mode (1990年-)
  • Arena (1993年-1998年)
  • Agora (1994年-1997年)英语Agora (web browser)
  • Argo (1994年-1997年)英语Argo (web browser)
  • Amaya (瀏覽器及編輯器,1996年-2012年)
會議
  • 國際萬維網大會(WWW大會)英语International World Wide Web Conference
    • 督導委員會(IW3C2)英语International World Wide Web Conferences Steering Committee
    • 第一屆(WWW1,1994年)英语First International Conference on the World-Wide Web
網頁技術與標準
文档呈现语言
样式格式描述语言
动态网页技术
用戶端互動技术
用戶端手稿語言
标识定位语言
文档纲要语言
* 代表由W3C制定和维护的标准与规范