首頁  >  文章  >  後端開發  >  瘋狂XML學習筆記(12)------------XPath

瘋狂XML學習筆記(12)------------XPath

黄舟
黄舟原創
2017-02-21 14:47:011419瀏覽


XPath 是一門在 XML 文件中尋找資訊的語言。 XPath 用於在 XML 文件中透過元素和屬性進行導覽。

 

#什麼是XPath?

  • 什麼是XPath?
  • XPath 使用路徑表達式在XML 文件中進行導航
  • XPath 包含一個標準函數庫

XPath 是XSLT 中的主要元素

XPath 是一個W3C 標準

XPath 路徑表達式

XPath 使用路徑表達式來選取XML 文件中的節點或節點集。這些路徑表達式和我們在常規的電腦檔案系統中看到的表達式非常相似。


XPath 標準函數

XPath 含有超過 100 個內建的函數。這些函數用於字串值、數值,日期和時間比較、節點和 QName 處理、序列處理、邏輯值等等。

 

在XPath 中,有七種類型的節點:元素、屬性、文字、命名空間、處理指令、註解以及文檔節點(或成為根節點)。

XPath 術語

節點(Node)

在XPath 中,有七種類型的節點:元素、屬性、文字、命名空間、處理指令、註解以及文件(根)節點。 XML 文件是被當作節點樹來對待的。樹的根被稱為文檔節點或根節點。

請看下面這個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 元素:



<book>
  <title>Harry Potter</title>
  <author>J K. Rowling</author>
  <year>2005</year>
  <price>29.99</price>
</book>

後代(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>

 

 

 

XPath Axes(座標軸)

XML 實例文件

#我們將在下面的範例中使用此XML 文件:XPath 軸軸可定義某個相對於目前節點的節點集。
<?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>
軸名稱 結果
#ancestor 選取目前節點的所有先輩(父、祖父等)
ancestor-or-self 選取目前節點的所有先輩(父、祖父等)以及目前節點本身
attribute 選取目前節點的所有屬性
ff 選取目前節點的所有子元素。
descendant 選取目前節點的所有後代元素(子、孫等)。
descendant-or-self 選取目前節點的所有後代元素(子、孫等)以及目前節點本身。
following 選取文件中目前節點的結束標籤之後的所有節點。
namespace######選取目前節點的所有命名空間節點############parent######選取目前節點的父節點。 ############preceding######選取文件中目前節點的開始標籤之前的所有節點。 ############preceding-sibling###### 選取目前節點之前的所有同級節點。 ############self######選取目前節點。 ############

位置路径表达式

位置路径可以是绝对的,也可以是相对的。

绝对路径起始于正斜杠( / ),而相对路径不会这样。在两种情况中,位置路径均包括一个或多个步,每个步均被斜杠分割:

绝对位置路径:

/step/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 运算符

下面列出了可用在 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 文档:

"books.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(路径表达式)

选取所有的 book 节点

下面的这个例子选取了 bookstore 元素下所有的 book 节点:

xmlDoc.selectNodes("/bookstore/book")

 

选取第一个 book 节点

下面的例子仅选取 bookstore 元素下第一个 book 节点:

xmlDoc.selectNodes("/bookstore/book[0]")

 

 

选取 price

下面的例子从所有的 price 节点选取文本:

xmlDoc.selectNodes("/bookstore/book/price/text()")

 

选取价格高于 35 的 price 价格

下面的例子会选取所有价格高于 35 的 price 节点:

xmlDoc.selectNodes("/bookstore/book[price>35]/price")

 

选取价格高于 35 的 title 节点

下面的例子会选取所有价格高于 35 的 title 节点:

xmlDoc.selectNodes("/bookstore/book[price>35]/title")

 

以上就是疯狂XML学习笔记(12)------------XPath的内容,更多相关内容请关注PHP中文网(www.php.cn)!

 

 

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn