一、什么是XPath?
Xpath 是一种能够在XML文档中寻找信息的语言。它通过XML文档中的元素和属性来进行导航。XPath 是针对XML文档部分内容定义的语法
XPath 使用路径表达式在XML文档中导航
XPath 包含了一系列标准函数
XPath 在XSLT当中是一个主要的元素
XPath 是W3C标准
XPath 路径表达式:
XPath 使用路径表达式来选择XML文档中的nodes(节)或是node-set(节集)。这些路径表达式看上去与你平时所见的传统计算机文件系统路径非常地相似。
XPath 标准函数:
XPath包含了数量超过100的内置函数。这些函数针对字符串值,数字值,日期和时间比较,节操作,顺序操作,布尔值,等等。
XPath被用在XSLT:
在XSLT标准中XPath是主要的元素。没有XPath知识你将很难建立XSLT文档。
XQuery和XPointer都建立于XPath表达式。XQuery 1.0 和 XPath 2.0共享相同的数据模型并支持相同的函数和操作。
XPath是W3C标准:
XPath于1999年11月16日成为W3C的推荐标准。
XPath被设计成为用语XSLT,XPoniter以及其他XML解析的软件。
二、XPath Nodes(节)
在XPath中有七种nodes(节):元素,属性,文字,命名空间,处理说明,注释,和文档(根)节。
XPath术语:
Nodes/节:XML文档被视为数状的节。树的根部被称为文档的节(或根节)。
Atomic values/原子值:原子值是那些没有子或父的节(无上下关系)。
Items/项目:项目是原子值或节。
Relationship of Nodes(节之间的关系):
Parent/父
Children/子
Siblings/兄
Ancestors/祖:节的父,父的父....都为祖
Descendants/孙:节的子,子的子...都为孙
三、XPath语法
XPath使用路径表达式来选择XML文档的节或是节集。顺着路径或步骤来选择节。
举例中我们将使用下面的XML文档:
<bookstore>
<book>
<title lang="eng">Harry Potter</title>
<price>29.99</price>
</book>
<book>
<title lang="eng">Learning XML</title>
<price>39.95</price>
</book>
</bookstore>
Selecting Nodes(选择节):
一些非常有用的路径表达式:
表达式 | 描述 |
nodename | Selects all child nodes of the node[选择所有目前节的子节] |
/ | Selects from the root node[从根节进行选择] |
// | Selects nodes in the document from the current node that match the selection no matter where they are [选择文档中相吻合的节而不管其在文档的何处] |
. | Selects the current node[选择当前节] |
.. | Selects the parent of the current node[当前节的父节] |
@ | Selects attributes[选择属性] |
(实例)下面我们所列举的表格有路径表达式以及其结果:
路径表达式 | 结果 |
bookstore | Selects all the child nodes of the bookstore element[选择所有bookstore元素的子节] |
/bookstore | Selects the root element bookstore
Note: If the path starts with a slash ( / ) it always represents an absolute path to an element! [选择了bookstore的根元素。注意:如果路径的开始为(/)那此路径一定是到该元素的绝对路径] |
bookstore/book | Selects all book elements that are children of bookstore[选择了所有在bookstore的子元素book元素所包含的所有元素(其实就为bookstore里book元素所包含的元素)] |
//book | Selects all book elements no matter where they are in the document[选择所有为book元素的内容而不管book元素处于何处(有不同的父也没关系)] |
bookstore//book | Selects all book elements that are descendant of the bookstore element, no matter where they are under the bookstore element[在bookstore元素内所有含有book元素的元素内容(只要book元素的祖元素为bookstore元素那都符合条件)] |
//@lang | Selects all attributes that are named lang[选择所有属性名为lang的属性] |
Predicates(谓语):
谓语用来指定明确的节所含有的特殊的值。
谓语被嵌入在中括号。
(实例)下面的表格列举了一些使用了谓语的路径表达式以及其产生的结果:
路径表达式 | 结果 |
/bookstore/book[1] | Selects the first book element that is the child of the bookstore element[选择了bookstore里的第一个book元素] |
/bookstore/book[last()] | Selects the last book element that is the child of the bookstore element[选择bookstore里最后一个book元素] |
/bookstore/book[last()-1] | Selects the last but one book element that is the child of the bookstore element[bookstore中倒数第二个book元素] |
/bookstore/book[position()<3] | Selects the first two book elements that are children of the bookstore element[在bookstore中前两个book元素] |
//title[@lang] | Selects all the title elements that have an attribute named lang[选择所有含有lang属性的title元素] |
//title[@lang='eng'] | Selects all the title elements that have an attribute named lang with a value of 'eng'[选择所有含有lang属性并且值为eng的title元素] |
/bookstore/book[price>35.00] | Selects all the book elements of the bookstore element that have a price element with a value greater than 35.00[选择所有bookstore中book元素里price元素内容大于35.00的book元素] |
/bookstore/book[price>35.00]/title | Selects all the title elements of the book elements of the bookstore element that have a price element with a value greater than 35.00[选择bookstore中book的子元素title,并且其兄弟元素price的内容得大于35.00] |
Selecting Unknown Nodes(选择未知的节):
XPath的通配符可以用来选择未知的XML元素
通配符 | 描述 |
* | Matches any element node[相吻合的所有元素节] |
@* | Matches any attribute node[相吻合的所有属性节] |
node() | Matches any node of any kind[吻合任何类型的节] |
路径表达式 | 结果 |
/bookstore/* | Selects all the child nodes of the bookstore element[选择所有bookstore的子节] |
//* | Selects all elements in the document[选择所有文档中的元素] |
//title[@*] | Selects all title elements which have any attribute[选择元素为title并且其含有属性] |
Selecting Several Paths(选择数个路径):
通过在XPath中使用 | 你可以选择数个路径: (实例)下面的表格我们会列举一些路径表达式以及其结果:
路径表达 | 结果 |
//book/title | //book/price | Selects all the title AND price elements of all book elements[选择所有book里title和price元素] |
//title | //price | Selects all the title AND price elements in the document[选择所有title和price元素] |
/bookstore/book/title | //price | Selects all the title elements of the book element of the bookstore element AND all the price elements in the document[选择所有book里的title元素和所有price元素] |
四、XPath轴
举例中我们将使用下面的XML文档:
<bookstore>
<book>
<title lang="eng">Harry Potter</title>
<price>29.99</price>
</book>
<book>
<title lang="eng">Learning XML</title>
<price>39.95</price>
</book>
</bookstore>
XPath Axes(XPath轴):
轴定义了相对于当前节的节集。轴名 | 结果 |
ancestor | Selects all ancestors (parent, grandparent, etc.) of the current node[选择了当前节的所有祖(父,祖父,等等)] |
ancestor-or-self | Selects all ancestors (parent, grandparent, etc.) of the current node and the current node itself[选择当前节的所有祖并且还有当前节自己] |
attribute | Selects all attributes of the current node[选择所有当前节的属性] |
child | Selects all children of the current node[选择所有当前节的子] |
descendant | Selects all descendants (children, grandchildren, etc.) of the current node[选择所有当前节的孙(子,孙子,等等)] |
descendant-or-self | Selects all descendants (children, grandchildren, etc.) of the current node and the current node itself[选择当前节的所有孙以及它本身] |
following | Selects everything in the document after the closing tag of the current node[选择所有在关闭当前节标签后的所有内容] |
following-sibling | Selects all siblings after the current node[选择所有当前节后的兄] |
namespace | Selects all namespace nodes of the current node[选择所有当前节的命名空间] |
parent | Selects the parent of the current node[选择当前节的父] |
preceding | Selects everything in the document that is before the start tag of the current node[选择当前节之前的所有内容] |
preceding-sibling | Selects all siblings before the current node[选择所有当前节之前的兄] |
self | Selects the current node[选择当前节] |
Location Path Expression(路径表达试定位):
定位路径可以是绝对的也可以是相对的。
绝对定位的路径由(/)开始,而相对定位就不这样。定位的路径由一个或多个步骤所组成,每部分由(/)相分隔:
An absolute location path:
/step/step/...
A relative location path:
step/step/...
Each step is evaluated against the nodes in the current node-set.
在当前的节集中每步的赋值是逆向的
A step consists of:
- an axis (defines the tree-relationship between the selected nodes and the current node)
- a node-test (identifies a node within an axis)[在轴中鉴定节]
- zero or more predicates (to further refine the selected node-set)[0个或多个谓语可以来更好的选择节]
定位的语法:
axisname::nodetest[predicate](实例) :
Example | 结果 |
child::book | Selects all book nodes that are children of the current node[选择当前节点下所有为book的子节点] |
attribute::lang | Selects the lang attribute of the current node[选择当前节点下所有属性为lang的内容] |
child::* | Selects all children of the current node[选择当前节下所有的子节] |
attribute::* | Selects all attributes of the current node[选择当前节所有的属性] |
child::text() | Selects all text child nodes of the current node[选择当前节点所有子节点的文字] |
child::node() | Selects all child nodes of the current node[选择所有当前节点的子节点] |
descendant::book | Selects all book descendants of the current node[选择当前节点所有为book的孙节点] |
ancestor::book | Selects all book ancestors of the current node[选择所有当前祖节点为book的节点] |
ancestor-or-self::book | Selects all book ancestors of the current node - and the current as well if it is a book node[当前节点和其祖节点为book的节点] |
child::*/child::price | Selects all price grandchildren of the current node[当前节点所有含price的孙子节点] |
五、XPath运算符
Xpaht表达式的返回值是:node-set、字符串、boolean、数值。
Xpath里使用的运算符:
Operator | Description | Example | Return value |
| | Computes two node-sets | //book | //cd | Returns a node-set with all book and cd elements |
+ | Addition | 6 + 4 | 10 |
- | Subtraction | 6 - 4 | 2 |
* | Multiplication |
6 * 4 |
24 |
div | Division | 8 div 4 | 2 |
= | Equal | price=9.80 | true if price is 9.80 false if price is 9.90 |
!= | Not equal | price!=9.80 | true if price is 9.90 false if price is 9.80 |
< | Less than | price<9.80 | true if price is 9.00 false if price is 9.80 |
<= | Less than or equal to | price<=9.80 | true if price is 9.00 false if price is 9.90 |
> | Greater than | price>9.80 | true if price is 9.90 false if price is 9.80 |
>= | Greater than or equal to | price>=9.80 | true if price is 9.90 false if price is 9.70 |
or | or | price=9.80 or price=9.70 | true if price is 9.80 false if price is 9.50 |
and | and | price>9.00 and price<9.90 | true if price is 9.80 false if price is 8.50 |
mod | Modulus (division remainder) | 5 mod 2 | 1 |
六、精彩实例
让我们来尝试通过观察一些实例来学习基础的XPath语法。我们将使用下面这个XML文档来进行实例:
"books.xml"
<bookstore>
<book category="COOKING">
<title lang="en">Everyday Italian</title>
<author>Giada De Laurentiis</author>
<year>2005</year>
<price>30.00</price>
</book>
<book category="CHILDREN">
<title lang="en">Harry Potter</title>
<author>J K. Rowling</author>
<year>2005</year>
<price>29.99</price>
</book>
<book category="WEB">
<title lang="en">XQuery Kick Start</title>
<author>James McGovern</author>
<author>Per Bothner</author>
<author>Kurt Cagle</author>
<author>James Linn</author>
<author>Vaidyanathan Nagarajan</author>
<year>2003</year>
<price>49.99</price>
</book>
<book category="WEB">
<title lang="en">Learning XML</title>
<author>Erik T. Ray</author>
<year>2003</year>
<price>39.95</price>
</book>
</bookstore>
选择节点:
我们使用了XMLDOM对象来加载XML文档并用selectNode()函数来进行XML文档上节点的选择:
xmlDoc.async="false"
xmlDoc.load("books.xml")
xmlDoc.selectNodes(path expression)
选择所有book节点:
下面这个实例就会选择所有bookstore元素以下的book节点:
xmlDoc.selectNodes("/bookstore/book")
选择第一个book节点:
xmlDoc.selectNodes("/bookstore/book[0]")
选择prices:
xmlDoc.selectNodes("/bookstore/book/price/text()")
选择price大于35的price节点:
xmlDoc.selectNodes("/bookstore/book[price>35]/price")
选择Price大于35的title节点:
xmlDoc.selectNodes("/bookstore/book[price>35]/title")