七、在Java中使用Xpath
在java1.5中推出了一个javax.xml.xpath包专门用来在java中使用Xpath表达式来读取xml。
1. 数据类型
在学习之前首先需要注意的是:Xpath的数据并不与Java有一一对应关系,Xpath1.0只声明了四种数据类型:
node-set number boolean string
对应到java就是:
number 映射为
java.lang.Double
string 映射为
java.lang.String
boolean 映射为
java.lang.Boolean
node-set 映射为
org.w3c.dom.NodeList
因此,在使用java的xpathAPI时,需要注意返回类型:
public Object evaluate(Object item, QName returnType)throws XPathExpressionException;
public String evaluate(Object item)throws XPathExpressionException;
public Object evaluate(InputSource source, QName returnType)throws XPathExpressionException;
public String evaluate(InputSource source)throws XPathExpressionException;
不指定返回类型时,缺省返回类型为String。指定返回类型时,需要把返回值由Object类型强制转换成对应的返回类型。
2. API的使用
类似于Dom,要得到一个Xpath对象,可以如下使用:
XPathFactory factory = XPathFactory.newInstance();
XPath xpath = factory.newXPath();
XPathExpression expression = xpath.compile("/bookstore//book/title/text()");
还是以之前的xml文档为例。要得到这个表达式的结果,我们先要得到一个输入对象,例如一个document:
DocumentBuilderFactory builderFactory = DocumentBuilderFactory.newInstance();
DocumentBuilder documentBuilder = builderFactory.newDocumentBuilder();
Document document = documentBuilder.parse(new File("books.xml"));
NodeList list = (NodeList) expression.evaluate(document,XPathConstants.NODESET);
这里可以看出,在使用Xpath的时候,我们好像需要很清楚的知道返回结果是什么。否则就不能得到意想的结果。
最后,我们得到一个title的list值:
for(int i = 0;i<list.getLength();i++){
System.out.println(list.item(i).getNodeValue());
}
Everyday Italian
Harry Potter
XQuery Kick Start
Learning XML