java でxml xpathで、ネームスペース
2007/11/14
java
xml
xpath
Java XPath API
java5以上です。
ネームスペースを使ってXPathを使って値をとるサンプルです。
package a;
import java.io.IOException;
import java.net.URISyntaxException;
import javax.xml.XMLConstants;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.ParserConfigurationException;
import javax.xml.xpath.XPath;
import javax.xml.xpath.XPathConstants;
import javax.xml.xpath.XPathExpression;
import javax.xml.xpath.XPathExpressionException;
import javax.xml.xpath.XPathFactory;
import org.w3c.dom.Document;
import org.xml.sax.SAXException;
import java.util.Iterator;
import javax.xml.namespace.NamespaceContext;
public class TestMain {
public static void main(String[] args) throws SAXException, IOException,
XPathExpressionException, ParserConfigurationException,
URISyntaxException {
DocumentBuilderFactory domFactory = DocumentBuilderFactory
.newInstance();
domFactory.setNamespaceAware(true);// 重要!!
DocumentBuilder builder = domFactory.newDocumentBuilder();
Document doc = builder.parse(TestMain.class.getResource("a.xml")
.toURI().toString());
a(doc);
System.out.println("----");
b(doc);
}
static void a(Document doc) throws XPathExpressionException {
XPathFactory factory = XPathFactory.newInstance();
XPath xpath = factory.newXPath();
XPathExpression expr = xpath
.compile("//book[@year='1969']/title/text()");
Object result = expr.evaluate(doc, XPathConstants.STRING);
System.out.println(result);
}
static void b(Document doc) throws XPathExpressionException {
XPathFactory factory = XPathFactory.newInstance();
XPath xpath = factory.newXPath();
xpath.setNamespaceContext(new MyNamespaceContext());
XPathExpression expr = xpath
.compile("//my:book[@year='2007']/my:title/text()");
Object result = expr.evaluate(doc, XPathConstants.STRING);
System.out.println(result);
}
static class MyNamespaceContext implements NamespaceContext {
public String getNamespaceURI(String prefix) {
if (prefix == null)
throw new NullPointerException("Null prefix");
else if ("my".equals(prefix))
return "http://deiji.jp";
else if ("xml".equals(prefix))
return XMLConstants.XML_NS_URI;
return XMLConstants.NULL_NS_URI;
}
public String getPrefix(String uri) {
throw new UnsupportedOperationException();
}
public Iterator getPrefixes(String uri) {
throw new UnsupportedOperationException();
}
}
}
import java.io.IOException;
import java.net.URISyntaxException;
import javax.xml.XMLConstants;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.ParserConfigurationException;
import javax.xml.xpath.XPath;
import javax.xml.xpath.XPathConstants;
import javax.xml.xpath.XPathExpression;
import javax.xml.xpath.XPathExpressionException;
import javax.xml.xpath.XPathFactory;
import org.w3c.dom.Document;
import org.xml.sax.SAXException;
import java.util.Iterator;
import javax.xml.namespace.NamespaceContext;
public class TestMain {
public static void main(String[] args) throws SAXException, IOException,
XPathExpressionException, ParserConfigurationException,
URISyntaxException {
DocumentBuilderFactory domFactory = DocumentBuilderFactory
.newInstance();
domFactory.setNamespaceAware(true);// 重要!!
DocumentBuilder builder = domFactory.newDocumentBuilder();
Document doc = builder.parse(TestMain.class.getResource("a.xml")
.toURI().toString());
a(doc);
System.out.println("----");
b(doc);
}
static void a(Document doc) throws XPathExpressionException {
XPathFactory factory = XPathFactory.newInstance();
XPath xpath = factory.newXPath();
XPathExpression expr = xpath
.compile("//book[@year='1969']/title/text()");
Object result = expr.evaluate(doc, XPathConstants.STRING);
System.out.println(result);
}
static void b(Document doc) throws XPathExpressionException {
XPathFactory factory = XPathFactory.newInstance();
XPath xpath = factory.newXPath();
xpath.setNamespaceContext(new MyNamespaceContext());
XPathExpression expr = xpath
.compile("//my:book[@year='2007']/my:title/text()");
Object result = expr.evaluate(doc, XPathConstants.STRING);
System.out.println(result);
}
static class MyNamespaceContext implements NamespaceContext {
public String getNamespaceURI(String prefix) {
if (prefix == null)
throw new NullPointerException("Null prefix");
else if ("my".equals(prefix))
return "http://deiji.jp";
else if ("xml".equals(prefix))
return XMLConstants.XML_NS_URI;
return XMLConstants.NULL_NS_URI;
}
public String getPrefix(String uri) {
throw new UnsupportedOperationException();
}
public Iterator getPrefixes(String uri) {
throw new UnsupportedOperationException();
}
}
}
<my xmlns="http://deiji.jp">
<book year="1969">
<title>aaaaa</title>
<author>nakawaka</author>
</book>
<book year="2007">
<title>bbbbb</title>
<author>shigeto</author>
</book>
</my>
<book year="1969">
<title>aaaaa</title>
<author>nakawaka</author>
</book>
<book year="2007">
<title>bbbbb</title>
<author>shigeto</author>
</book>
</my>
: