いまさらXPathを使ってみた
いまさらながらですが、JavaScriptでXPathを使ってみた。
IE対応はしていないけど、手順としては
- document.createExpression()でxpath式を設定してXPathExpressionオブジェクトを取得
- 取得したXPathExpression.evaluate()を使ってXPathの評価結果のXPathResultオブジェクトを取得
- evaluate()の第2引数に渡したTypeによってプロパティやiterateNext()かsnapshotItem()でオブジェクトを取得
といった流れのようだ。
で、書いてみた
<html> <head> <script type="application/javascript"> function func(){ var xmlDoc = new DOMParser().parseFromString('<root><test>テスト1</test><test>テスト2</test></root>', "application/xml") var xpathExpr = document.createExpression("root/test[2]/text()", null); var result = xpathExpr.evaluate(xmlDoc, XPathResult.ORDERED_NODE_SNAPSHOT_TYPE, null); alert(result.snapshotItem(0).nodeValue); } </script> </head> <body> <input type="button" name="button" value="おす" onclick="func();"></input> </body> </html>
DOMParserでxml生成しておおちゃくしてますが。
ボタン押すと、テスト2が表示される。
あと、やってみてわかったこと。
- XPathつかって評価するのが1回だけならdocument.evaluate()も使えるらしい
- XPathExpression.evaluate()の第2引数によって、結果を保持するプロパティや取得するメソッドが変わる
- ANY_TYPE どれでも
- NUMBER_TYPE numberValueに結果保持
- STRING_TYPE stringValueに結果保持
- BOOLEAN_TYPE booleanValueに結果保持
- UNORDER_NODE_ITERATOR_TYPE iterateNext()で取得。順番付けなし
- ORDERED_NODE_ITERATOR_TYPE iterateNext()で取得。ドキュメント順
- UNORDERED_NODE_SNAPSHOT_TYPE snapshotItem()で取得。引数はインデックス。順番付けなし
- ORDERED_NODE_SNAPSHOT_TYPE snapshotItem()で取得。引数はインデックス。ドキュメント順
- ANY_UNORDERED_NODE_TYPE singleNodeValueに保持。
- FIRST_ORDERED_NODE_TYPE singleNodeValueに最初のノードを保持。
今回はORDERED_NODE_SNAPSHOT_TYPEを使ってみたけどこれは1つずつ試してみる必要があるな。