xPathとはXML文書から条件に該当したものを取り出す仕様のこと。
以下、Javaでのサンプル。
XpathLab.java
package harada; import java.io.*; import javax.xml.parsers.*; import org.w3c.dom.*; import org.w3c.dom.traversal.*; import org.apache.xpath.*; class XpathLab{ public static void main(String[] args) { System.out.println("start: "); try { // DOMパーサ用ファクトリの生成 DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance(); factory.setNamespaceAware(true); // DOM Documentインスタンス用ファクトリの生成 DocumentBuilder builder = factory.newDocumentBuilder(); // xmlファイルの取得 Document doc = builder.parse("c:\\test\\data.xml"); System.out.println("検索結果1"); Node n; // @sex='female'に該当するノードのnameを取得 NodeIterator nl = XPathAPI.selectNodeIterator(doc, "/userlist/item[@sex='female']/name/text()"); while ((n = nl.nextNode()) != null) { System.out.println("name→ " + n.toString()); } System.out.println("検索結果2"); // userid<='002'に該当するノードを取得 nl = XPathAPI.selectNodeIterator(doc, "/userlist/item[@userid<='002']"); while ((n = nl.nextNode()) != null) { System.out.println("Attributes→ " + n.getAttributes().toString()); } } catch (Exception e) { e.printStackTrace(); } System.out.println("end: "); } }
data.xml
<?xml version="1.0" encoding="UTF-8"?> <userlist> <item sex="male" userid="001"> <name>しむらけん</name> <tel kind="home">093-391-xxxx</tel> <tel kind="mobile">090-1111-xxxx</tel> </item> <item sex="female" userid="002"> <name>うえとあや</name> <tel kind="mobile">090-2222-xxxx</tel> </item> <item sex="female" userid="003"> <name>あやや</name> <tel kind="mobile">090-3333-xxxx</tel> </item> <item sex="male" userid="999"> <name>まえだけん</name> <tel kind="mobile">090-4444-xxxx</tel> </item> </userlist>
実行結果
start: 検索結果1 name→ うえとあや name→ あやや 検索結果2 Attributes→ sex="male" userid="001" Attributes→ sex="female" userid="002" end:
演算子の記述が想定していたものと違った。
例えば、「<=」は「<=」と記述したらうまく動作しなかった。
xpathを取得するライブラリのバージョンの問題かも?