ホームページ  >  記事  >  バックエンド開発  >  クレイジー XML 学習メモ (12)----------XPath

クレイジー XML 学習メモ (12)----------XPath

黄舟
黄舟オリジナル
2017-02-21 14:47:011378ブラウズ


XPath は、XML ドキュメント内の情報を検索するための言語です。 XPath は、XML ドキュメント内の要素と属性間を移動するために使用されます。

XPathとは何ですか?

  • XPathはXMLドキュメント内を移動するためにパス式を使用します

  • XPathはXSLTの主要要素です
  • XPath は W3C 標準です

これらのパス式は、通常のコンピューターのファイル システムで見られるものと非常に似ています。

XPath標準関数

XPathには100を超える組み込み関数が含まれています。これらの関数は、文字列値、数値、日付と時刻の比較、ノードと QName の処理、シーケンス処理、論理値などに使用されます。

XPath には、要素、属性、テキスト、名前空間、処理命令、コメント、ドキュメント ノード (またはルート ノード) の 7 種類のノードがあります。


XPath用語ノード(ノード)

XPathには、要素、属性、テキスト、名前空間、処理命令、コメント、文書(ルート)ノードの7種類のノードがあります。 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" (属性节点)

基本値 (または原子値、原子値)

基本値は親も子も持たないノードです。

基本値の例:

J K. Rowling
"en"

Item

Item は基本的な値またはノードです。

ノード関係

各要素と属性には親があります。

以下の例では、book 要素は、title、author、year、price 要素の親です:

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

Children

要素ノードは、0、1 つ、または複数の子を持つことができます。

次の例では、title、author、year、price 要素はすべて book 要素の子です:

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

Siblings (兄弟)

同じ親を持つノード

次の例では、title、author、The 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 ドキュメントを使用します。

<?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 は現在のノードのすべての属性を選択します
child は現在のノードのすべての子要素を選択します。
descendant 現在のノードのすべての子孫要素 (子、孫など) を選択します。
descendant-or-self 現在のノードと現在のノード自体のすべての子孫要素 (子、孫など) を選択します。
ドキュメント内の現在のノードの終了タグの後にあるすべてのノードを選択します。
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 までご連絡ください。