XMLで利用するXPathを扱うためのパッケージです。
XPathパッケージはW3C(World Wide Web
Consortium)で策定されているDOM(Document Object Model)Level 3 XPath Version1.0の一部の機能を除いたサブセットです。
名前 |
説明 |
Version |
||
PC |
Mobile |
AI |
||
XPathの各オブジェクトを生成するクラスです |
4.0.0 |
- |
- |
|
XPathパッケージで発生する例外です |
4.0.0 |
- |
- |
|
XPathの構文解析を行います |
4.0.0 |
- |
- |
|
XPathの評価で名前空間のプレフィックスを解決するためのクラスです |
4.0.0 |
- |
- |
|
XPathの結果を保持します |
4.0.0 |
- |
- |
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構文は、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">
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ノードを全て選択します。