使用XPath查询XML文档简单用例

 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

 

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值