Dom4j和XPATH操作xml(模拟学生管理系统,实现增删改查)

首先因为经常使用创建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包哦。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

鹈鹕吃吃吃

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值