xPath


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を取得するライブラリのバージョンの問題かも?