XML文档样本
<?xml version="1.0" encoding="UTF-8"?>
<inventory>
<book year="2000">
<title>Snow Crash</title>
<author>Neal Stephenson</author>
<publisher>Spectra</publisher>
<isbn>0553380958</isbn>
<price>14.95</price>
</book>
<book year="2005">
<title>Burning Tower</title>
<author>Larry Niven</author>
<author>Jerry Pournelle</author>
<publisher>Pocket</publisher>
<isbn>0743416910</isbn>
<price>5.99</price>
</book>
<book year="1995">
<title>Zodiac</title>
<author>Neal Stephenson</author>
<publisher>Spectra</publisher>
<isbn>0553573862</isbn>
<price>7.50</price>
</book>
<!-- more books... -->
</inventory>
测试程序
/**
*
*/
package cn.jhz.mybatislearningcode.parser;
import java.io.IOException;
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.w3c.dom.NodeList;
import org.xml.sax.ErrorHandler;
import org.xml.sax.SAXException;
import org.xml.sax.SAXParseException;
/**
* @author asus
*
*/
public class XpathTest {
/**
* @param args
* @throws ParserConfigurationException
* @throws IOException
* @throws SAXException
* @throws XPathExpressionException
*/
public static void main(String[] args) throws ParserConfigurationException, SAXException, IOException, XPathExpressionException {
DocumentBuilderFactory documentBuilderFactory = DocumentBuilderFactory.newInstance();
//定义工厂,使应用程序能够从XML文档获取生成DOM对象树的解析器.
/*开启验证*/
documentBuilderFactory.setValidating(true);
//指定此代码生成的解析器将在文档解析时验证文档。 默认值为false.
//这里的“验证”是指XML推荐中定义的a validating parser.换句话说,它基本上只是控制DTD验证.
documentBuilderFactory.setNamespaceAware(false);
//指定此代码生成的解析器将为XML命名空间提供支持。 默认值为false.
documentBuilderFactory.setIgnoringComments(true);
//指定此代码生成的解析器将忽略注释。 默认值为false.
documentBuilderFactory.setIgnoringElementContentWhitespace(false);
//指定此工厂创建的解析器必须在解析XML文档时消除元素内容中的空格(有时称为“可忽略的空白”)(请参阅XML Rec 2.10).
//请注意,只有具有仅包含元素内容模型(参见XML Rec 3.2.1)的元素内容中直接包含的空格将被消除。 由于依赖于内容模型,此设置需要解析器处于验证模式.默认值为false.
documentBuilderFactory.setCoalescing(false);
//指定此代码生成的解析器将CDATA节点转换为文本节点并将其附加到相邻(如果有的话)文本节点. 默认值为false.
documentBuilderFactory.setExpandEntityReferences(true);
//指定此代码生成的解析器将扩展实体引用节点.默认值为true.
/*创建DocumentBuilder*/
DocumentBuilder builder = documentBuilderFactory.newDocumentBuilder();
//使用当前配置的参数创建一个新的DocumentBuilder实例.
//定义从XML文档获取DOM文档实例的API。 使用这个类,应用程序员可以从XML获得一个Document.
/*设置异常处理对象*/
builder.setErrorHandler(new ErrorHandler() {
@Override
public void warning(SAXParseException exception) throws SAXException {
// TODO 自动生成的方法存根
System.out.println("WARN:" + exception.getMessage());
}
@Override
public void error(SAXParseException exception) throws SAXException {
// TODO 自动生成的方法存根
System.out.println("fatalError:" + exception.getMessage());
}
@Override
public void fatalError(SAXParseException exception) throws SAXException {
// TODO 自动生成的方法存根
System.out.println("error:" + exception.getMessage());
}
});
/*将文档加载到一个Documeent对象中*/
Document doc = builder.parse("src/test/resources/inventory.xml");
//将给定URI的内容解析为XML文档并返回一个新的DOM Document对象。 如果URI为null,则抛出一个IllegalArgumentException.
//Document接口代表整个HTML或XML文档。 在概念上,它是文档树的根,并提供对文档数据的主访问.
/*创建XPathFactory*/
XPathFactory factory = XPathFactory.newInstance();
//获取一个新的XPathFactory实例使用默认对象模型, DEFAULT_OBJECT_MODEL_URI ,W3C DOM.
//一个XPathFactory实例可以用来创建XPath对象。
/*创建XPath对象*/
XPath xPath = factory.newXPath();
//建立默认函数解析器.
/*编译XPath表达式*/
XPathExpression expr = xPath.compile("//book[author='Neal Stephenson']/title/text()");
//提供对编译的XPath表达式的访问
/* 通过XPath表达式得到结果
* 第一个参数指定了XPath表达式进行查询的上下文节点,也就是在指定节点下查找符合XPath的节点(本例中的上下文节点使整个文档)
* 第二个参数制定了XPath表达式的返回类型
*/
Object result = expr.evaluate(doc, XPathConstants.NODESET);
//在指定的上下文中评估编译的XPath表达式,并将结果作为指定的类型返回.
System.out.println("查询作者为Neal Stephenson的图书的标题:");
NodeList nodes = (NodeList) result;
//强制类型转换
//NodeList接口提供了节点的有序集合的抽象,而不定义或约束如何实现该集合。 NodeList DOM中的对象是活的.
//NodeList中的项目可以通过整数索引访问,从0开始.
for (int i = 0; i < nodes.getLength(); i++)
System.out.println(nodes.item(i).getNodeValue());
System.out.println("查询1997年之后的图书的标题");
nodes = (NodeList) xPath.evaluate("//book[@year>1997]/title/text()", doc, XPathConstants.NODESET);
//在指定的上下文中评估一个XPath表达式,并将结果作为指定的类型返回.
for (int i = 0; i < nodes.getLength(); i++)
System.out.println(nodes.item(i).getNodeValue());
}
}
打印结果:
fatalError:文档根元素 "inventory" 必须匹配 DOCTYPE 根 "null"。
fatalError:文档无效: 找不到语法。
查询作者为Neal Stephenson的图书的标题:
Snow Crash
Zodiac
查询1997年之后的图书的标题
Snow Crash
Burning Tower