Jakarta-Commons-JXPath

JDK1.4以前なら、JavaでXPathを使おうとすると、このJakarta-Commons-JXPathライブラリを
使うのが常套手段でした。
http://jakarta.apache.org/commons/jxpath/

JDK1.5になって、標準のXPathクラスがリリースされましたが、JXPathライブラリは、
下記の機能を有しており、JDK1.5標準のXPathよりも高機能です。

  • 複数のXPath候補を取得できる
  • DOMの値を上書き更新できる
  • DOMに新しいノード(および属性)を追加できる
よって、読み出すだけなら JDK1.5標準のXPath, 書き込みがあればJXPathと使い分けると良いでしょう。

シンプルな使い方

JDK1.5標準のXPathと同じく、単一のXPath候補を取得するサンプルプログラムを下に示します。
見た目は JDK標準のXPathとほぼ同じでしょう。
なお、XMLファイルから、引数の aDocumentを作成する手順は、本サイトのDOMを読み込む
を参照してください。

// JXPathContextの準備

JXPathライブラリは、Documentインスタンスをラップした JXPathContextというクラスを通じて
DOMアクセスを行いますので、事前に作成しておきます。

// aXPathを適用する

JXPathContextのgetValue の引数にXPathを適用すれば、該当の値が取得できます。
注意点ですが、戻り値はObject型で戻ってきます。
実体が何のインスタンスかは、問い合わせたXPath関数に依存します。

JXPathの戻り値の型
XPathの問い合わせ 戻り値の実体 XPath例
通常のタグや属性を指す String /price/food/item/@name
数値変換を行う関数 Double count(/price/food/item)
bool関数 Boolean boolean(/price/food/item/@name='そば')
フードメニューにそばがあればtrueになる

数値型の戻り値の問題点

JXPathは、数値型の戻り値が全てDouble型で返ってくるので、count関数
floor関数など、明らかに整数値になるものでも、obj.toString()の出力は
1.0 などの小数点付になります。

回避策の例としては、下記の様に、Number型で末尾が .0 なら小数点以下を切り捨てるという
方法を管理人はよく使います。