Java5以降でXPathを使う

メモ

//TestXpath.java
import java.io.StringReader;
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.NodeList;
import org.xml.sax.InputSource;

public class TestXpath {
    public static void main(String[] args) throws Exception{
        String xml = 
                "<ro>" +
                " <ch attr = 'b' sub='b'>bbb</ch>" +
                "   <ch>none</ch>" +
                " <ch attr = 'c' sub = 'cc'>ccc</ch>" +
                " <pa name='pupu'>" +
                "   <ch attr='d' sub='d'>ddd</ch>" +
                "   <nd>mine</nd>" +
                "   <nd>yours</nd>" +
                " </pa>" +
                " <nd>other</nd>" +
                "</ro>";
        InputSource is = new InputSource(new StringReader(xml));
        Document d = DocumentBuilderFactory.newInstance().newDocumentBuilder().parse(is);
        
        XPathFactory xf = XPathFactory.newInstance();
        XPath xp = xf.newXPath();
        System.out.println(xp.evaluate("//ch[@attr='d']", d));
        System.out.println(xp.evaluate("//ch[@attr][2]", d));
        System.out.println(xp.evaluate("//pa/ch", d));
        System.out.println(xp.evaluate("//nd[2]", d));
        System.out.println(xp.evaluate("//ch[4]", d));//これはだめ
        System.out.println(xp.evaluate("//ch[@attr!=@sub]", d));
        System.out.println(xp.evaluate("//ch[@attr='d']/parent::*/@name", d));
        System.out.println(xp.evaluate("count(//ch)", d));
        double c = (Double)xp.evaluate("count(//nd)", d, XPathConstants.NUMBER);
        System.out.println(c);
        //ノード集合
        System.out.println("--");
        NodeList nl = (NodeList) xp.evaluate("//ch", d, XPathConstants.NODESET);
        for(int i = 0; i < nl.getLength(); ++i){
            System.out.println(nl.item(i).getTextContent());
        }
        //属性の集合
        System.out.println("--");
        nl = (NodeList) xp.evaluate("//ch/@attr", d, XPathConstants.NODESET);
        for(int i = 0; i < nl.getLength(); ++i){
            System.out.println(nl.item(i).getTextContent());
        }
    }
}