XPath实现XML文档的查询

一、XPath路径表达式

XPath路径表达式是XML文档中查询数据的语言

表达式描述
nodename选取此节点的所有子节点
/从根节点选取
//从匹配选择的当前节点选择文档的节点,不考虑其位置
.选取当前节点
选取当前节点的父节点
@选取属性

二、jaxen

Jaxen是一个Java编写的XPath库,可以适应多种不同的对象模型,如:DOM,XOM,dom4j等。

Dom4j底层依赖Jaxen实现Xpath查询

三、程序实现

xml页面

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hr SYSTEM "hr.dtd"><!-- 人力资源管理系统 -->
<hr>
	<employee no="3301">
		<name>张三</name>
		<age>31</age>
		<salary>3500</salary>
		<department>
			<dname>行政部</dname>
			<address>xx大厦-B103</address>
		</department>
	</employee>
	
	<employee no="3302">
		<name>张四</name>
		<age>32</age>
		<salary>4500</salary>
		<department>
			<dname>行政部</dname>
			<address>xx大厦-B103</address>
		</department>
	</employee>
	
	<employee no="3303">
		<name>张五</name>
		<age>33</age>
		<salary>5200</salary>
		<department>
			<dname>行政部</dname>
			<address>xx大厦-B103</address>
		</department>
	</employee>
	
	<employee no="3304">
		<name>张六</name>
		<age>34</age>
		<salary>5500</salary>
		<department>
			<dname>行政部</dname>
			<address>xx大厦-B103</address>
		</department>
	</employee>

	<employee no="3305">
		<name>李四</name>
		<age>29</age>
		<salary>8000</salary>
		<department>
			<dname>技术部</dname>
			<address>xx大厦-B104</address>
		</department>
	</employee>
	
	<employee no="3306">
		<name>李五</name>
		<age>26</age>
		<salary>7000</salary>
		<department>
			<dname>技术部</dname>
			<address>xx大厦-B104</address>
		</department>
	</employee>

	<employee no="3307">
		<name>王五</name>
		<age>24</age>
		<salary>3600</salary>
		<department>
			<dname>人事部</dname>
			<address>XX大厦-B205</address>
		</department>
	</employee>
</hr>

java页面

package com.imooc.dom4j;

import java.util.List;

import org.dom4j.Document;
import org.dom4j.DocumentException;
import org.dom4j.Element;
import org.dom4j.Node;
import org.dom4j.io.SAXReader;

public class XPathTester {
	public void xpath(String xpathExp) {
		String file = "d:/workplace/xml/src/hr.xml";
		SAXReader reader = new SAXReader();
		try {
			Document document = reader.read(file);
			List<Node> nodes = document.selectNodes(xpathExp);
			for(Node node :nodes) {
				Element emp = (Element)node;
				System.out.println(emp.attributeValue("no"));
				System.out.println(emp.elementText("name"));
				System.out.println(emp.elementText("age"));
				System.out.println(emp.elementText("salary"));
				System.out.println("=========================");
			}
		} catch (DocumentException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}
	
	public static void main(String[] args) {
		XPathTester tester = new XPathTester();
//		tester.xpath("/hr/employee");
//		tester.xpath("//employee");
//		tester.xpath("//employee[salary<4000]");
//		tester.xpath("//employee[name='李四']");
//		tester.xpath("//employee[@no=3305]");
//		tester.xpath("//employee[1]");
//		tester.xpath("//employee[last()]");
//		tester.xpath("//employee[position()<4]");
		tester.xpath("//employee[3] | //employee[5]");
	}
}

四、查询输出

  1. 总体查询
    tester.xpath("//employee");

  2. 工资小于4000的员工
    tester.xpath("//employee[salary<4000]");

  3. 查找"李四"这个员工
    tester.xpath("//employee[name='李四']");

  4. 编号为“3305”的员工
    tester.xpath("//employee[@no=3305]");

  5. 第一个员工
    tester.xpath("//employee[1]");5

  6. 最后一个员工
    tester.xpath("//employee[last()]");

  7. 前三个员工
    tester.xpath("//employee[position()<4]");

  8. 第三个和第五个员工
    tester.xpath("//employee[3] | //employee[5]");

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值