1、dom4j支持Xpath的操作形式
可以直接取到某个元素
形式一:aaa/bbb/ccc 表示层级关系 aaa下的bbb下的ccc
形式二://aaa/bbb 表示只要是aaa下的 ,所有的bbb
形式三: /* 所有元素
形式四:
BBB[1] : 表示第一个BBB元素
BBB[last] : 最后一个BBB
形式五: //BBB[@id]: 得到所有含id属性的BBB
形式六: //BBB[@id='b1']: 得到所有含id属性且 id= b1 的BBB
2、 dom4j实现Xpath的操作及前提
操作前提: 默认情况下,dom4j不支持xpath
准备工作:
导入支持 xpath 的 jar 包 使用 jaxen-1.1-beta-6.jar
支持xpath的两个方法(dom4j里面提供的)
selectNodes("xpath表达式"): 获取多个节点
selectSingle Nodes("xpath表达式"): 获取单个节点
1)使用xpath实现查询所有name的值
xpath表达式为: //name
selectNodes("xpath表达式"): 获取多个节点
步骤:
1)得到document // Document document = Dom4jUtils.getDocument(Dom4jUtils.Path);
2)获取所有name.selectNodes("name");
// List<Node> list = document.selectNodes("//name");
3)遍历list集合 输出name值
for (Node node : list) {
String s = node.getText();
System.out.println(s);
}
2)使用xpath实现查询第一个p1下面的name的值
xpath表达式为: p1[@id="1"]/name
selectSingle Nodes("xpath表达式"): 获取单个节点
步骤:
1)得到document // Document document = Dom4jUtils.getDocument(Dom4jUtils.Path);
2)获取name. selectSingleNode("//p1[@id1='1']/name");
//Node name1 = document.selectSingleNode("//p1[@id1='aaaa']/name");
3) 得到并输出name值
String s = name1.getText();
System.out.println(s);
3、实现简单的学生管理操作
使用xml当作数据,存储学生信息
创建xml文件 写一些学生信息
分包:
测试类 : 用于测试方法
用户类 : 用户的基本内容
文件信息类 :用户的基本内容存放
方法类 : 删除,添加,查询。
package service;
import java.io.FileOutputStream;
import java.io.IOException;
import java.util.List;
import org.dom4j.Document;
import org.dom4j.DocumentException;
import org.dom4j.Element;
import org.dom4j.Node;
import org.dom4j.io.OutputFormat;
import org.dom4j.io.SAXReader;
import org.dom4j.io.XMLWriter;
import value.Student;
public class StuService {
// 查询 根据id查询学生信息
public static Student getStu(String id) throws DocumentException {
// 创建解析器
SAXReader saxReader = new SAXReader();
// 得到dcument
Document document = saxReader.read("src/student.xml");
// 获得所有id
List<Node> list = document.selectNodes("//id");
Student student = new Student();
// 遍历集合
for (Node node : list) {
// 找到id值和传递值相等的节点
if (node.getText().equals(id)) {
Element stu = node.getParent();// 得到父节点
//通过父节点得到其他子节点,然后得到其他子节点的值
String namev = stu.element("name").getText();
String agev = stu.element("age").getText();
String idv = node.getText();
//在for外创建一个student对象,然后传值给student
student.setId(idv);
student.setName(namev);
student.setAge(agev);
}
}
return student;
}
// 删除 根据学生id删除
public static void delStu(String id) throws Exception {
// 创建解析器
SAXReader saxReader = new SAXReader();
// 得到dcument
Document document = saxReader.read("src/student.xml");
// 获得所有id
List<Node> list = document.selectNodes("//id");
// 遍历集合
for (Node node : list) {
// 找到id值和传递值相等的节点
if (node.getText().equals(id)) {
Element stu = node.getParent();// 得到父节点
Element student = stu.getParent(); // 得到父节点的父节点
student.remove(stu); // 删除父节点
}
}
// 对内存的操作完后,回写到xml文件中
// OutputFormat format = OutputFormat.createPrettyPrint();
XMLWriter xmlWriter = new XMLWriter(new FileOutputStream(
"src/student.xml"), OutputFormat.createPrettyPrint());
xmlWriter.write(document);
xmlWriter.close();
}
// 增加
public static void addStu(Student student) throws DocumentException,
IOException {
// TODO Auto-generated method stub
// 创建解析器
SAXReader saxReader = new SAXReader();
// 得到dcument
Document document = saxReader.read("src/student.xml");
// 得到根节点
Element root = document.getRootElement();
// 添加元素stu
Element stu = root.addElement("stu");
// 向stu 内添加 id name age
Element id1 = stu.addElement("id");
Element name1 = stu.addElement("name");
Element age1 = stu.addElement("age");
// 给id name age 赋值
id1.setText(student.getId());
name1.setText(student.getName());
age1.setText(student.getAge());
// 回写
OutputFormat forment = OutputFormat.createPrettyPrint();
XMLWriter xmlWriter = new XMLWriter(new FileOutputStream(
"src/student.xml"), forment);
xmlWriter.write(document);
xmlWriter.close();
}
}
xml文件
<?xml version="1.0" encoding="UTF-8"?>
<student>
<stu>
<id>001</id>
<name>aaa</name>
<age>10</age>
</stu>
<stu>
<id>002</id>
<name>bbb</name>
<age>20</age>
</stu>
<stu>
<id>003</id>
<name>ccc</name>
<age>300</age>
</stu>
</student>