One Day-XML:XPath
XPath 是一門在 XML 文檔中查找信息的語言。XPath 可用來在 XML 文檔中對元素和屬性進(jìn)行遍歷。
XPath 是 W3C XSLT 標(biāo)準(zhǔn)的主要元素,并且 XQuery 和 XPointer 同時被構(gòu)建于 XPath 表達(dá)之上。
因此,對 XPath 的理解是很多高級 XML 應(yīng)用的基礎(chǔ)。
?
XPath 是一門在 XML 文檔中查找信息的語言。XPath 用于在 XML 文檔中通過元素和屬性進(jìn)行導(dǎo)航。
在學(xué)習(xí)之前應(yīng)該具備的知識:
在您繼續(xù)學(xué)習(xí)之前,應(yīng)該對下面的知識有基本的了解:
- HTML / XHTML
- XML / XML 命名空間
如果您希望首先學(xué)習(xí)這些項目,請在我們的?首頁?訪問這些教程。
什么是 XPath?
- XPath 使用路徑表達(dá)式在 XML 文檔中進(jìn)行導(dǎo)航
- XPath 包含一個標(biāo)準(zhǔn)函數(shù)庫
- XPath 是 XSLT 中的主要元素
- XPath 是一個 W3C 標(biāo)準(zhǔn)
XPath 路徑表達(dá)式
XPath 使用路徑表達(dá)式來選取 XML 文檔中的節(jié)點或者節(jié)點集。這些路徑表達(dá)式和我們在常規(guī)的電腦文件系統(tǒng)中看到的表達(dá)式非常相似。
XPath 標(biāo)準(zhǔn)函數(shù)
XPath 含有超過 100 個內(nèi)建的函數(shù)。這些函數(shù)用于字符串值、數(shù)值,日期和時間比較、節(jié)點和 QName 處理、序列處理、邏輯值等等。
XPath 在 XSLT 中使用
XPath 是 XSLT 標(biāo)準(zhǔn)中的主要元素。如果沒有 XPath 方面的知識,您就無法創(chuàng)建 XSLT 文檔。
您可以在我們的《XSLT 教程》中的內(nèi)容。
XQuery 和 XPointer 均構(gòu)建于 XPath 表達(dá)式之上。XQuery 1.0 和 XPath 2.0 共享相同的數(shù)據(jù)模型,并支持相同的函數(shù)和運算符。
您可以在我們的《XQuery 教程》中有關(guān) XQuery 的知識。
XPath 是 W3C 標(biāo)準(zhǔn)
XPath 于 1999年11月16日 成為 W3C 標(biāo)準(zhǔn)。
XPath 被設(shè)計供 XSLT、XPointer 以及其他 XML 解析軟件使用。
您可以在我們的《W3C 教程》中有關(guān) XPath 標(biāo)準(zhǔn)的信息。?
XPath 節(jié)點
?在 XPath 中,有七種類型的節(jié)點:元素、屬性、文本、命名空間、處理指令、注釋以及文檔節(jié)點(或成為根節(jié)點)。
XPath 術(shù)語
節(jié)點(Node)
在 XPath 中,有七種類型的節(jié)點:元素、屬性、文本、命名空間、處理指令、注釋以及文檔(根)節(jié)點。XML 文檔是被作為節(jié)點樹來對待的。樹的根被稱為文檔節(jié)點或者根節(jié)點。
請看下面這個 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文檔中的節(jié)點例子:
<bookstore> (文檔節(jié)點) <author>J K. Rowling</author> (元素節(jié)點) lang="en" (屬性節(jié)點)基本值(或稱原子值,Atomic value)
基本值是無父或無子的節(jié)點。
基本值的例子:
J K. Rowling "en"項目(Item)
項目是基本值或者節(jié)點。
節(jié)點關(guān)系
父(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)
元素節(jié)點可有零個、一個或多個子。
在下面的例子中,title、author、year 以及 price 元素都是 book 元素的子:
<book><title>Harry Potter</title><author>J K. Rowling</author><year>2005</year><price>29.99</price> </book>同胞(Sibling)
擁有相同的父的節(jié)點
在下面的例子中,title、author、year 以及 price 元素都是同胞:
<book><title>Harry Potter</title><author>J K. Rowling</author><year>2005</year><price>29.99</price> </book>先輩(Ancestor)
某節(jié)點的父、父的父,等等。
在下面的例子中,title 元素的先輩是 book 元素和 bookstore 元素:
<bookstore><book><title>Harry Potter</title><author>J K. Rowling</author><year>2005</year><price>29.99</price> </book></bookstore>后代(Descendant)
某個節(jié)點的子,子的子,等等。
在下面的例子中,bookstore的后代是 book、title、author、year 以及 price 元素:
<bookstore><book><title>Harry Potter</title><author>J K. Rowling</author><year>2005</year><price>29.99</price> </book></bookstore>XPath 語法
?XPath 使用路徑表達(dá)式來選取 XML 文檔中的節(jié)點或節(jié)點集。節(jié)點是通過沿著路徑 (path) 或者步 (steps) 來選取的。
XML 實例文檔
我們將在下面的例子中使用這個 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>選取節(jié)點
XPath 使用路徑表達(dá)式在 XML 文檔中選取節(jié)點。節(jié)點是通過沿著路徑或者 step 來選取的。
下面列出了最有用的路徑表達(dá)式:
| nodename | 選取此節(jié)點的所有子節(jié)點 |
| / | 從根節(jié)點選取 |
| // | 從匹配選擇的當(dāng)前節(jié)點選擇文檔中的節(jié)點,而不考慮它們的位置 |
| . | 選取當(dāng)前節(jié)點 |
| .. | 選取當(dāng)前節(jié)點的父節(jié)點 |
| @ | 選取屬性 |
實例
在下面的表格中,我們已列出了一些路徑表達(dá)式以及表達(dá)式的結(jié)果:
| bookstore | 選取 bookstore 元素的所有子節(jié)點 |
| /bookstore | 選取根元素 bookstore 注釋:假如路徑起始于正斜杠( / ),則此路徑始終代表到某元素的絕對路徑! |
| bookstore/book | 選取所有屬于 bookstore 的子元素的 book 元素。 |
| //book | 選取所有 book 子元素,而不管它們在文檔中的位置。 |
| bookstore//book | 選擇所有屬于 bookstore 元素的后代的 book 元素,而不管它們位于 bookstore 之下的什么位置。 |
| //@lang | 選取所有名為 lang 的屬性。 |
謂語(Predicates)
謂語用來查找某個特定的節(jié)點或者包含某個指定的值的節(jié)點。
謂語被嵌在方括號中。
實例
在下面的表格中,我們列出了帶有謂語的一些路徑表達(dá)式,以及表達(dá)式的結(jié)果:
| /bookstore/book[1] | 選取屬于 bookstore 子元素的第一個 book 元素。 |
| /bookstore/book[last()] | 選取屬于 bookstore 子元素的最后一個 book 元素。 |
| /bookstore/book[last()-1] | 選取屬于 bookstore 子元素的倒數(shù)第二個 book 元素。 |
| /bookstore/book[position()<3] | 選取最前面的兩個屬于 bookstore 元素的子元素的 book 元素。 |
| //title[@lang] | 選取所有擁有名為 lang 的屬性的 title 元素。 |
| //title[@lang='eng'] | 選取所有 title 元素,且這些元素?fù)碛兄禐?eng 的 lang 屬性。 |
| /bookstore/book[price>35.00] | 選取所有 bookstore 元素的 book 元素,且其中的 price 元素的值須大于 35.00。 |
| /bookstore/book[price>35.00]/title | 選取所有 bookstore 元素中的 book 元素的 title 元素,且其中的 price 元素的值須大于 35.00。 |
選取未知節(jié)點
XPath 通配符可用來選取未知的 XML 元素。
| * | 匹配任何元素節(jié)點 |
| @* | 匹配任何屬性節(jié)點 |
| node() | 匹配任何類型的節(jié)點 |
實例
在下面的表格中,我們列出了一些路徑表達(dá)式,以及這些表達(dá)式的結(jié)果:
| /bookstore/* | 選取 bookstore 元素的所有子節(jié)點 |
| //* | 選取文檔中的所有元素 |
| //title[@*] | 選取所有帶有屬性的 title 元素。 |
選取若干路徑
通過在路徑表達(dá)式中使用“|”運算符,您可以選取若干個路徑。
實例
在下面的表格中,我們列出了一些路徑表達(dá)式,以及這些表達(dá)式的結(jié)果:
| //book/title | //book/price | 選取所有 book 元素的 title 和 price 元素。 |
| //title | //price | 選取所有文檔中的 title 和 price 元素。 |
| /bookstore/book/title | //price | 選取所有屬于 bookstore 元素的 book 元素的 title 元素,以及文檔中所有的 price 元素。 |
?
XPath Axes(坐標(biāo)軸)
?
XML 實例文檔
我們將在下面的例子中使用此 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 軸
軸可定義某個相對于當(dāng)前節(jié)點的節(jié)點集。
| ancestor | 選取當(dāng)前節(jié)點的所有先輩(父、祖父等) |
| ancestor-or-self | 選取當(dāng)前節(jié)點的所有先輩(父、祖父等)以及當(dāng)前節(jié)點本身 |
| attribute | 選取當(dāng)前節(jié)點的所有屬性 |
| child | 選取當(dāng)前節(jié)點的所有子元素。 |
| descendant | 選取當(dāng)前節(jié)點的所有后代元素(子、孫等)。 |
| descendant-or-self | 選取當(dāng)前節(jié)點的所有后代元素(子、孫等)以及當(dāng)前節(jié)點本身。 |
| following | 選取文檔中當(dāng)前節(jié)點的結(jié)束標(biāo)簽之后的所有節(jié)點。 |
| namespace | 選取當(dāng)前節(jié)點的所有命名空間節(jié)點 |
| parent | 選取當(dāng)前節(jié)點的父節(jié)點。 |
| preceding | 選取文檔中當(dāng)前節(jié)點的開始標(biāo)簽之前的所有節(jié)點。 |
| preceding-sibling | 選取當(dāng)前節(jié)點之前的所有同級節(jié)點。 |
| self | 選取當(dāng)前節(jié)點。 |
位置路徑表達(dá)式
位置路徑可以是絕對的,也可以是相對的。
絕對路徑起始于正斜杠( / ),而相對路徑不會這樣。在兩種情況中,位置路徑均包括一個或多個步,每個步均被斜杠分割:
絕對位置路徑:
/step/step/...相對位置路徑:
step/step/...每個步均根據(jù)當(dāng)前節(jié)點集之中的節(jié)點來進(jìn)行計算。
步(step)包括:
軸(axis)步的語法:
軸名稱::節(jié)點測試[謂語]實例
| child::book | 選取所有屬于當(dāng)前節(jié)點的子元素的 book 節(jié)點 |
| attribute::lang | 選取當(dāng)前節(jié)點的 lang 屬性 |
| child::* | 選取當(dāng)前節(jié)點的所有子元素 |
| attribute::* | 選取當(dāng)前節(jié)點的所有屬性 |
| child::text() | 選取當(dāng)前節(jié)點的所有文本子節(jié)點 |
| child::node() | 選取當(dāng)前節(jié)點的所有子節(jié)點 |
| descendant::book | 選取當(dāng)前節(jié)點的所有 book 后代 |
| ancestor::book | 選擇當(dāng)前節(jié)點的所有 book 先輩 |
| ancestor-or-self::book | 選取當(dāng)前節(jié)點的所有book先輩以及當(dāng)前節(jié)點(假如此節(jié)點是book節(jié)點的話) |
| child::*/child::price | 選取當(dāng)前節(jié)點的所有 price 孫。 |
?
XPath 運算符
?XPath 表達(dá)式可返回節(jié)點集、字符串、邏輯值以及數(shù)字。
XPath 運算符
下面列出了可用在 XPath 表達(dá)式中的運算符:
| | | 計算兩個節(jié)點集 | //book | //cd | 返回所有帶有 book 和 cd 元素的節(jié)點集 |
| + | 加法 | 6 + 4 | 10 |
| - | 減法 | 6 - 4 | 2 |
| * | 乘法 | 6 * 4 | 24 |
| div | 除法 | 8 div 4 | 2 |
| = | 等于 | price=9.80 | 如果 price 是 9.80,則返回 true。 如果 price 是 9.90,則返回 fasle。 |
| != | 不等于 | price!=9.80 | 如果 price 是 9.90,則返回 true。 如果 price 是 9.80,則返回 fasle。 |
| < | 小于 | price<9.80 | 如果 price 是 9.00,則返回 true。 如果 price 是 9.90,則返回 fasle。 |
| <= | 小于或等于 | price<=9.80 | 如果 price 是 9.00,則返回 true。 如果 price 是 9.90,則返回 fasle。 |
| > | 大于 | 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 | 計算除法的余數(shù) | 5 mod 2 | 1 |
?
XPath 實例
?在本節(jié),讓我們通過實例來學(xué)習(xí)一些基礎(chǔ)的 XPath 語法。
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>在您的瀏覽器中查看此 "books.xml" 文件。
節(jié)點選取
我們將使用微軟的 XML DOM 對象來載入 XML 文檔,并使用 selectNodes() 函數(shù)從 XML 文檔選取節(jié)點:
set xmlDoc=CreateObject("Microsoft.XMLDOM") xmlDoc.async="false" xmlDoc.load("books.xml")xmlDoc.selectNodes(路徑表達(dá)式)選取所有的 book 節(jié)點
下面的這個例子選取了 bookstore 元素下所有的 book 節(jié)點:
xmlDoc.selectNodes("/bookstore/book")假如您正在使用 IE 5 或更高的版本,可以親自試一試。
選取第一個 book 節(jié)點
下面的例子僅選取 bookstore 元素下第一個 book 節(jié)點:
xmlDoc.selectNodes("/bookstore/book[0]")假如您正在使用 IE 5或更高的版本,可以親自試一試。
注釋:IE 5 和 6 會把 [0] 作為第一個節(jié)點來執(zhí)行,但是根據(jù) W3C 的標(biāo)準(zhǔn),應(yīng)該使用 [1] !!
注釋:這個問題在 IE 6 SP2 中被糾正了!
選取 price
下面的例子從所有的 price 節(jié)點選取文本:
xmlDoc.selectNodes("/bookstore/book/price/text()")假如您正在使用 IE 5 或更高的版本,可以親自試一試。
選取價格高于 35 的 price 價格
下面的例子會選取所有價格高于 35 的 price 節(jié)點:
xmlDoc.selectNodes("/bookstore/book[price>35]/price")假如您正在使用 IE 5 或更高的版本,可以親自試一試。
選取價格高于 35 的 title 節(jié)點
下面的例子會選取所有價格高于 35 的 title 節(jié)點:
xmlDoc.selectNodes("/bookstore/book[price>35]/title")假如您正在使用 IE 5 或更高的版本,可以親自試一試。
?
?
?
ref:http://www.w3school.com.cn/xpath/index.asp?
轉(zhuǎn)載于:https://www.cnblogs.com/BpLoveGcy/archive/2010/04/10/1709055.html
總結(jié)
以上是生活随笔為你收集整理的One Day-XML:XPath的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: EXTJS布局示例(panel,View
- 下一篇: Hibernate Shards 数据的