首先因为经常使用创建document对象和进行回写操作,所以将代码放到一起写一个小小的工具类,这样我们使用时就可以直接调方法了。
工具类
import org.dom4j.Document;
import org.dom4j.DocumentException;
import org.dom4j.io.OutputFormat;
import org.dom4j.io.SAXReader;
import org.dom4j.io.XMLWriter;
import java.io.FileOutputStream;
import java.io.IOException;
public class Dom4jTool {
// 设置一个固定的路径,方便操作
public static final String PATH = "student/src/student.xml";
// 获取document对象
public static Document getDocument(String path){
try {
SAXReader saxReader = new SAXReader();
Document document = saxReader.read(path);
return document;
} catch (DocumentException e) {
e.printStackTrace();
}
return null;
}
// 回写xml方法
public static void xmlWriters(String path,Document document){
try {
OutputFormat outputFormat = OutputFormat.createPrettyPrint();
XMLWriter xmlWriter = new XMLWriter(new FileOutputStream(path),outputFormat);
xmlWriter.write(document);
xmlWriter.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
接下来上xml的内容,操作的就是这个文件了,实现增删改查操作,内容不是很多,都通过注释的方法写在代码里了。
xml文件
<?xml version="1.0" encoding="UTF-8"?>
<student>
<stu>
<id>2</id>
<name>哈哈</name>
<age>17</age>
</stu>
<stu>
<id>3</id>
<name>旺旺</name>
<age>19</age>
</stu>
</student>
当后面实现类中的方法需要传递的参数比较多时,直接传参数就会很麻烦,创建Student对象是为了方便操作。
Student类
public class Student {
private String id;
private String name;
private String age;
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getAge() {
return age;
}
public void setAge(String age) {
this.age = age;
}
@Override
public String toString() {
return "Student{" +
"id='" + id + '\'' +
", name='" + name + '\'' +
", age='" + age + '\'' +
'}';
}
}
这里是实现增删改查的方法。
实现类
import org.dom4j.Document;
import org.dom4j.Element;
import org.dom4j.Node;
import tools.Dom4jTool;
import vo.Student;
import java.util.List;
public class StuService {
// 添加
public static void addsu(Student student) {
// 获取document对象
Document document = Dom4jTool.getDocument(Dom4jTool.PATH);
// 获取根节点
Element rootElement = document.getRootElement();
// 通过根节点创建一个stu标签
Element stu = rootElement.addElement("stu");
//通过stu创建name,age,id
Element id1 = stu.addElement("id");
Element name1 = stu.addElement("name");
Element age1 = stu.addElement("age");
// 将获取到Student对象里面的值,存放到标签内
id1.setText(student.getId());
name1.setText(student.getName());
age1.setText(student.getAge());
// 回写
Dom4jTool.xmlWriters(Dom4jTool.PATH, document);
}
// 查询
public static Student selectstu(String id) {
Document document = Dom4jTool.getDocument(Dom4jTool.PATH);
// 通过XPATH,获取所有的id标签,集合接受
List<Node> list = document.selectNodes("//id");
// 创建Student对象,作用是:将查询到的数据封装返回
Student student = new Student();
// 增强for遍历这个集合
for (Node node : list) {
// 循环获得id的值
String idd = node.getText();
// 判断获得的值是否于传过来的值相等
if (idd.equals(id)) {
// 获取id值的父节点
Element stu = node.getParent();
// 通过父节点获取子节点,子节点调用方法获取值
String name = stu.element("name").getText();
String age = stu.element("age").getText();
// 将值封装到Student
student.setId(idd);
student.setName(name);
student.setAge(age);
}
}
// 返回Student
return student;
}
// 删除
public static void deletestu(String id) {
// 获取document对象
Document document = Dom4jTool.getDocument(Dom4jTool.PATH);
List<Node> list = document.selectNodes("//id");
for (Node node : list) {
String idv = node.getText();
if (idv.equals(id)) {
// 获取这个id的父节点
Element stu = node.getParent();
// 获取父节点的父节点
Element st = stu.getParent();
// 通过爷爷节点删除父节点,达到删除所有子节点的目的
st.remove(stu);
// 回写
Dom4jTool.xmlWriters(Dom4jTool.PATH, document);
}
}
}
// 修改
public static void revisestu(String id,Student student){
// 获取document对象
Document document = Dom4jTool.getDocument(Dom4jTool.PATH);
// 获取xml文件中所有的id
List<Node> list = document.selectNodes("//id");
// 遍历id
for(Node node : list){
// 获取id的值
String text = node.getText();
// 通过判断找到和传过来id值相等的值
if(text.equals(id)){
// 获取传过来的对象里面的数据
String id1 = student.getId();
String name1 = student.getName();
String age1 = student.getAge();
// 获取id的父节点
Element parent = node.getParent();
// 通过父节点获取子节点
Element name = parent.element("name");
// 设置值
name.setText(name1);
// 获取age节点
parent.element("age");
// 设置值
name.element(age1);
// 设置id的值
node.setText(id1);
// 回写
Dom4jTool.xmlWriters(Dom4jTool.PATH,document);
}
}
}
}
开始测试
测试类
import service.StuService;
import vo.Student;
public class Test {
public static void main(String[] args) {
// 直接调用方法即可
revisesstu();
}
// 实现添加方法
public static void addTest(){
// 创建对象
Student s = new Student();
// 将要添加的属性值放到Student
s.setId("1");
s.setName("啦嘿嘿");
s.setAge("19");
// 调用StuService类中的add方法,将student对象传过去
StuService.addsu(s);
}
// 实现删除方法
public static void delectSstu(){
// 传递一个ID值
StuService.deletestu("2");
}
// 实现查询方法
public static void selectsstu(){
//
Student s = StuService.selectstu("1");
System.out.println(s.toString());
}
// 实现修改方法
public static void revisesstu(){
// 创建对象,设置值封装到对象里面
Student s = new Student();
s.setId("44");
s.setName("四四四四");
s.setAge("99");
// 将要修改的学生的id传过去,和Student
StuService.revisestu("1",s);
}
}
由于代码量太多,就不一步一步写实现的过程了,过程其实都在注释里。
比较适合和我一样的初学者练习。
上面的代码,每一段我都放了一个文件。
代码中的命名纯属随便命名的,可能稍微有点乱。。。嗯,我相信逻辑清晰的你们肯定能看懂,毕竟我注释写的还算是详细。
有兴趣的朋友们可以自己写一遍练习一些,我写的并不完善还有待改进,练习的时候记得导dom4j和XPATH的jar包哦。