いまさらXPathを使ってみた

いまさらながらですが、JavaScriptXPathを使ってみた。
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つずつ試してみる必要があるな。