XPathパッケージ

 

 

XMLで利用するXPathを扱うためのパッケージです。

XPathパッケージはW3C(World Wide Web Consortium)で策定されているDOM(Document Object Model)Level 3 XPath Version1.0の一部の機能を除いたサブセットです。

 

クラス

 

名前

説明

Version

PC版

XPathEvaluator

XPathの各オブジェクトを生成するクラスです

4.0.0

XPathException

XPathパッケージで発生する例外です

4.0.0

XPathExpression

XPathの構文解析を行います

4.0.0

XPathNSResolver

XPathの評価で名前空間のプレフィックスを解決するためのクラスです

4.0.0

XPathResult

XPathの結果を保持します

4.0.0

 

W3C DOM Level3 XPathについて

 

W3Cにより公開されているDocument Object Model (DOM) Level 3 XPath Specification Version 1.0は、Biz/Browser ver4.0.0のリリース時点(2003年8月)でCandidate Recommendationです。

今後も、W3Cにより仕様策定が続けられますが、Biz/Browser ver3.0に組み込まれている機能については、既に概ね仕様が確定している部分に止めているため、大きな変更は受けないと推定されます。

 

サポートされないオブジェクト

 

W3C DOM Level3 XPathに含まれる以下のオブジェクトは、Biz/Browserではサポート外となり利用することはできません。

 

XPathNamespaceインターフェース

 

XPath構文(Expression) の互換性について

 

利用できるXPath構文は、W3Cにより勧告されているXML Path Language (XPath) Version 1.0 W3C Recommendation 16 November 1999の文書に以下の点を除き準拠しています。

 

1. 数値はすべて符号付整数で表現されます。

2. 名前空間の解決で相対パスを考慮しません。

3. 名前空間の解決でXPathResolverが解決可能なデフォルトネームスペースのみ参照します。通常は、DocumentElementで定義されたデフォルトネームスペースです。コンテキストノードに応じたデフォルトネームスペースを扱うことはできません。

4. XPathNamespaceインタフェースを利用する操作は、アトリビュート操作に代替されます。また、結果としてXPathNamespaceオブジェクトが選択される局面では、XmlAttrオブジェクトで代替されます。

5. XPathの評価結果は常にORDERED_NODE_SNAPSHOT_TYPEです。数値や文字列、イテレータなど他の型を指定した場合、ORDERD_NODE_SNAPSHOTから変換された結果が返されます。

 

Biz/Browserでは、ver3.0よりXmlNode.SelectNodes、XmlNode.SelectSingleNodeメソッドで簡易的にXPath構文のサブセットを利用してNodeを検索することができましたが、ver4.0.0より拡張されたXPathパッケージのXPath構文とは互換性がありません。

利用する際には挙動のちがいに注意してください。

 

典型的な利用方法

 

XPathパッケージは、XPathEvaluatorクラスのスタティックメソッドにより、XPathNSResolverオブジェクト、XPathExpressionオブジェクトを生成し、XPathExpression.EvauateメソッドによりXPath構文を評価し、XPathResultオブジェクトで結果を受け取ります。

 

/* XML文書をダウンロードします*/
var session = getHttpSession();
var response = session.Get("data.xml");
 
/* DOMツリーを作成します */
var domImpl = new XmlDOMImplementation;
var dom = domImpl.Load(response);
 
/* XPathによる検索を準備します*/
var resolver = XPathEvaluator.CreateNSResolver(dom);
var expression = XPathEvaluator.CreateExpression("//x", resolver);
 
/* 検索を実行します */
var result = expression.Evaluate(dom.documentElement, XPathResult.ORDERED_NODE_SNAPSHOT_TYPE);
 
/* 検索結果を確認します */
var len = result.SnapshotLength;
for (var i = 0; i < len; i++) {
    var node = result.SnapshotItem(i);
    print("No " + str(i + 1) + ": " + node.xml, "\n");
}
 
----- 実行結果 -----
No 1: <x name="x1">
No 2: <x name="x2">
No 3: <x name="x3">
No 4: <x name="x4">
No 5: <x name="x5">

 

XPath構文例

 

child::para

para

コンテキストノードの子からparaノードを選択します。

 

child::*

*

コンテキストノードの子ノード全てを選択します。

 

child::text()

text()

コンテキストノードの子ノードの内、空でないtextノードを全て選択します。

 

child::node()

node()

コンテキストノードの子ノード全てを選択します。

 

attribute::name

@name

コンテキストノードのnameアトリビュートを選択します。

 

attribute::*

@*

コンテキストノードの全てのアトリビュートを選択します。

 

descendant::para

コンテキストノードの子孫から全てのparaノードを選択します。

 

ancestor::div

コンテキストノードの先祖から全てのdivノードを選択します。

 

ancestor-or-self::div

コンテキストノードとその先祖から全てのdivノードを選択します。

 

descendant-or-self::para

コンテキストノードとその子孫から全てのparaノードを選択します。

 

self::para

コンテキストノードがparaの場合コンテキストノードを選択します。

 

child::chapter/descendant::para

chapter//para

コンテキストノードの子chapterノードの子孫から全てのparaノードを選択します。

 

child::*/child::para

*/para

コンテキストノードの孫ノードから全てのparaノードを選択します。

 

/

先頭に指定された場合、ドキュメントルートを選択します。

 

/descendant::para

ドキュメント内の全てのparaノードを選択します。

 

/descendant::olist/child::item

ドキュメント内のolistノードの子からitemノードを全て選択します。

 

child::para[position()=1]

para[1]

コンテキストノードの子ノードから先頭のparaノードを選択します。

 

child::para[position()=last()]

para[last()]

コンテキストノードの子ノードから最後のparaノードを選択します。

 

child::para[position()=last()-1]

para[last()-1]

コンテキストノードの子ノードから最後から2番目のparaノードを選択します。

 

child::para[position()>1]

コンテキストノードの子ノードから2番目以降のparaノードを全てを選択します。

 

following-sibling::chapter[position()=1]

コンテキストノードに後続する兄弟から最初のchapterノードを選択します。

 

preceding-sibling::chapter[position()=1]

コンテキストノードに先行する兄弟から先頭のchapterノードを選択します。

 

/descendant::figure[position()=42]

ドキュメント内の全てのfigureノードから42番目のノードを選択します。

 

/child::doc/child::chapter[position()=5]/child::section[position()=2]

/doc/chapter[5]/section[2]

ドキュメントエレメントdocの子から5番目のchapterの2番目のsectionノードを選択します。

 

child::para[attribute::type="warning"]

para[@type="warning"]

コンテキストノードの子からtypeアトリビュートに"warning"を持つすべてのparaノードを選択します。

 

child::para[attribute::type="warning"][position()=5]

para[@type='warning'][5]

コンテキストノードの子からtypeアトリビュートに"warning"を持つ5番目のparaノードを選択します。

 

child::para[position()=5][attribute::type="warning"]

para[5][@type="warning"]

コンテキストノードの子から5番目のparaノードのtypeアトリビュートに"warning"を持っていれば選択します。

 

child::chapter[child::title="Introduction"]

chapter[title="Introduction"]

コンテキストノードの子ノードchapterの内、titleに"Introduction"を持つノードを選択します。

 

child::chapter[child::title]

chapter[title]

コンテキストノードの子ノードchapterの内、titleノードを子に持つノードを選択します。

 

child::*[self::chapter or self::appendix]

コンテキストノードの全ての子ノードの内、chapterノードかappendixノードを全てを選択します。

 

child::*[self::chapter or self::appendix][position()=last()]

コンテキストノードの全ての子ノードの内、chapterノードかappendixノードを持つ、最後のノードを選択します。

 

/descendant-or-self::node()/child::chapter[position()=2]

//chapter[2]

ドキュメント内の全てのノードの2番目のchapterノードを全て選択します。

 



「オンラインマニュアル」一覧へ戻る
「Bizの宝箱」TOPへ戻る