Java で XPath を使う方法
注意 [2009.10.13]
この記事で書かれている方法は、W3C DOM 3 XPath Specification とは異なる独自実装を用いています。
W3C DOM 3 XPath の勧告に従った方法で XPath を評価する という記事を書きましたので、そちらに記した方法で XPath 式を実行することをおすすめします。
本文
Java で XPath を使う方法に関しては javax.xml.xpath.XPath vs org.apache.xpath.XPathAPI という文書を読むとよくわかる。 が、各クラスの名前空間が明示されていなくてちょっと悩むかも。 というわけで import 文で名前空間を明示したサンプルコードを書いた。
XML の名前空間に関する部分は含んでいない。 なお、読み込んだ XML ファイルは さきほど書いた記事 のソースコード中にあるものと同等である。
package info.vividcode; import java.io.File; import javax.xml.parsers.DocumentBuilder; import javax.xml.parsers.DocumentBuilderFactory; import javax.xml.xpath.XPath; import javax.xml.xpath.XPathConstants; import javax.xml.xpath.XPathFactory; import org.w3c.dom.Document; import org.w3c.dom.Node; import org.w3c.dom.NodeList; import org.w3c.dom.traversal.NodeIterator; import com.sun.org.apache.xpath.internal.XPathAPI; public class Test { public static void main( String[] args ) { try { // ===== XML 文書の読み込み ===== DocumentBuilder builder = DocumentBuilderFactory.newInstance() .newDocumentBuilder(); Document doc = builder.parse( new File("file.xml") ); // ===== javax.xml.xpath.XPath を使う方法 ===== // 準備 XPathFactory factory = XPathFactory.newInstance(); XPath xpath = factory.newXPath(); // 単一ノード取得 String location = "/test/t1/text/text()"; System.out.println( xpath.evaluate(location, doc) ); // 複数ノード取得 location = "//t1/t2[2]/text()"; NodeList entries = (NodeList) xpath.evaluate( location, doc, XPathConstants.NODESET ); for( int i = 0; i < entries.getLength(); i++ ) { System.out.println( entries.item(i).getNodeValue() ); } // ===== org.apache.xpath.XPathAPI を使う方法 ===== // 単一ノード取得 location = "/test/t1/text/text()"; System.out.println( XPathAPI.eval(doc, location) ); // 複数ノード取得 //location = "//t1/t2[2]/text()"; location = "/descendant::t2[2]/text()"; NodeIterator it = XPathAPI.selectNodeIterator(doc, location); Node node; while( (node = it.nextNode()) != null ) { System.out.println( node.getNodeValue() ); } } catch ( Exception e ) { // TODO Auto-generated catch block e.printStackTrace(); } } }