XPath 是一門在 XML 文件中尋找資訊的語言。 XPath 用於在 XML 文件中透過元素和屬性進行導覽。
XPath 是XSLT 中的主要元素
XPath 是一個W3C 標準
XPath 路徑表達式
XPath 使用路徑表達式來選取XML 文件中的節點或節點集。這些路徑表達式和我們在常規的電腦檔案系統中看到的表達式非常相似。
XPath 含有超過 100 個內建的函數。這些函數用於字串值、數值,日期和時間比較、節點和 QName 處理、序列處理、邏輯值等等。 在XPath 中,有七種類型的節點:元素、屬性、文字、命名空間、處理指令、註解以及文檔節點(或成為根節點)。
XPath 術語
在XPath 中,有七種類型的節點:元素、屬性、文字、命名空間、處理指令、註解以及文件(根)節點。 XML 文件是被當作節點樹來對待的。樹的根被稱為文檔節點或根節點。
<?xml version="1.0" encoding="ISO-8859-1"?> <bookstore> <book> <title lang="en">Harry Potter</title> <author>J K. Rowling</author> <year>2005</year> <price>29.99</price> </book> </bookstore>
上面的XML文件中的節點範例:
<bookstore> (文档节点) <author>J K. Rowling</author> (元素节点) lang="en" (属性节点)
基本值(或稱為原子值,Atomic value)
J K. Rowling "en"
項目(Item)
項目是基本值或節點。
父(Parent)
在下面的例子中,book 元素是title、author、year 以及price 元素的父:
<book> <title>Harry Potter</title> <author>J K. Rowling</author> <year>2005</year> <price>29.99</price> </book>
子(Children)
在下面的例子中,title、author、year 以及price 元素都是book 元素的子:
<book> <title>Harry Potter</title> <author>J K. Rowling</author> <year>2005</year> <price>29.99</price> </book>
同胞(Sibling)
在下面的例子中,title、author、year 以及price 元素都是同胞:
<book> <title>Harry Potter</title> <author>J K. Rowling</author> <year>2005</year> <price>29.99</price> </book>
先輩(Ancestor)
某節點的父、父的父,等等。
在下面的例子中,title 元素的先輩是book 元素和bookstore 元素:
後代(Descendant)某個節點的子,子的子,等等。 在下面的範例中,bookstore的後人是book、title、author、year 以及price 元素:<book> <title>Harry Potter</title> <author>J K. Rowling</author> <year>2005</year> <price>29.99</price> </book>
<book> <title>Harry Potter</title> <author>J K. Rowling</author> <year>2005</year> <price>29.99</price> </book>
XPath Axes(座標軸)
XML 實例文件
<?xml version="1.0" encoding="ISO-8859-1"?> <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 軸 |
軸可定義某個相對於目前節點的節點集。 | |
軸名稱 | 結果 |
#ancestor | 選取目前節點的所有先輩(父、祖父等) |
ancestor-or-self | 選取目前節點的所有先輩(父、祖父等)以及目前節點本身 |
attribute | 選取目前節點的所有屬性 |
ff | 選取目前節點的所有子元素。 |
descendant | 選取目前節點的所有後代元素(子、孫等)。 |
descendant-or-self | 選取目前節點的所有後代元素(子、孫等)以及目前節點本身。 |
following | 選取文件中目前節點的結束標籤之後的所有節點。 |
位置路径可以是绝对的,也可以是相对的。
绝对路径起始于正斜杠( / ),而相对路径不会这样。在两种情况中,位置路径均包括一个或多个步,每个步均被斜杠分割:
/step/step/...
step/step/...
每个步均根据当前节点集之中的节点来进行计算。
轴(axis)
定义所选节点与当前节点之间的树关系
节点测试(node-test)
识别某个轴内部的节点
零个或者更多谓语(predicate)
更深入地提炼所选的节点集
轴名称::节点测试[谓语]
例子 | 结果 |
---|---|
child::book | 选取所有属于当前节点的子元素的 book 节点 |
attribute::lang | 选取当前节点的 lang 属性 |
child::* | 选取当前节点的所有子元素 |
attribute::* | 选取当前节点的所有属性 |
child::text() | 选取当前节点的所有文本子节点 |
child::node() | 选取当前节点的所有子节点 |
descendant::book | 选取当前节点的所有 book 后代 |
ancestor::book | 选择当前节点的所有 book 先辈 |
ancestor-or-self::book | 选取当前节点的所有book先辈以及当前节点(假如此节点是book节点的话) |
child::*/child::price | 选取当前节点的所有 price 孙。 |
XPath 运算符
XPath 表达式可返回节点集、字符串、逻辑值以及数字。
下面列出了可用在 XPath 表达式中的运算符:
运算符 | 描述 | 实例 | 返回值 |
---|---|---|---|
| | 计算两个节点集 | //book | //cd | 返回所有带有 book 和 cd 元素的节点集 |
+ | 加法 | 6 + 4 | 10 |
- | 减法 | 6 - 4 | 2 |
* | 乘法 | 6 * 4 | 24 |
p | 除法 | 8 p 4 | 2 |
= | 等于 | price=9.80 |
如果 price 是 9.80,则返回 true。 如果 price 是 9.90,则返回 fasle。 |
!= | 不等于 | price!=9.80 |
如果 price 是 9.90,则返回 true。 如果 price 是 9.80,则返回 fasle。 |
9fc5941b8cd202545c198dc5280966e0 | 大于 | price>9.80 |
如果 price 是 9.90,则返回 true。 如果 price 是 9.80,则返回 fasle。 |
>= | 大于或等于 | price>=9.80 |
如果 price 是 9.90,则返回 true。 如果 price 是 9.70,则返回 fasle。 |
or | 或 | price=9.80 or price=9.70 |
如果 price 是 9.80,则返回 true。 如果 price 是 9.50,则返回 fasle。 |
and | 与 | price>9.00 and price<9.90 |
如果 price 是 9.80,则返回 true。 如果 price 是 8.50,则返回 fasle。 |
mod | 计算除法的余数 | 5 mod 2 | 1 |
我们将在下面的例子中使用这个 XML 文档:
<?xml version="1.0" encoding="ISO-8859-1"?> <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>
我们将使用微软的 XML DOM 对象来载入 XML 文档,并使用 selectNodes() 函数从 XML 文档选取节点:
set xmlDoc=CreateObject("Microsoft.XMLDOM") xmlDoc.async="false" xmlDoc.load("books.xml") xmlDoc.selectNodes(路径表达式)
下面的这个例子选取了 bookstore 元素下所有的 book 节点:
xmlDoc.selectNodes("/bookstore/book")
下面的例子仅选取 bookstore 元素下第一个 book 节点:
xmlDoc.selectNodes("/bookstore/book[0]")
下面的例子从所有的 price 节点选取文本:
xmlDoc.selectNodes("/bookstore/book/price/text()")
下面的例子会选取所有价格高于 35 的 price 节点:
xmlDoc.selectNodes("/bookstore/book[price>35]/price")
下面的例子会选取所有价格高于 35 的 title 节点:
xmlDoc.selectNodes("/bookstore/book[price>35]/title")
以上就是疯狂XML学习笔记(12)------------XPath的内容,更多相关内容请关注PHP中文网(www.php.cn)!