Java学习路线-46:XML快速入门(2)-dom4j、XPATH、应用案例

简介: Java学习路线-46:XML快速入门(2)-dom4j、XPATH、应用案例

第5 章 : XML解析之dom4j

课时31 dom4j的简介

https://dom4j.github.io/

依赖

<dependency>
    <groupId>org.dom4j</groupId>
    <artifactId>dom4j</artifactId>
    <version>2.0.0</version>
</dependency>

demo.xml

<?xml version="1.0" encoding="UTF-8"?>
<list> 
  <person> 
    <name>张三</name>  
    <age>23</age> 
  </person>  
  <person> 
    <name>李四</name>  
    <age>24</age> 
  </person> 
</list>

课时32 使用dom4j实现查询xml操作

import org.dom4j.Document;
import org.dom4j.DocumentException;
import org.dom4j.Element;
import org.dom4j.io.SAXReader;
import java.util.List;
class Demo {
    public static void main(String[] args) throws DocumentException {
        // 创建解析器
        SAXReader reader = new SAXReader();
        // 得到Document
        Document document = reader.read("demo.xml");
        // 获取根元素
        Element root = document.getRootElement();
        // 得到所有person标签
        List<Element> list = root.elements("person");
        // 遍历标签
        for (Element element : list) {
            Element name = element.element("name");
            // 获取值
            String text = name.getText();
            System.out.println(text);
        }
    }
}

课时33 使用dom4j实现在末尾添加节点的操作

import org.dom4j.Document;
import org.dom4j.DocumentException;
import org.dom4j.Element;
import org.dom4j.io.OutputFormat;
import org.dom4j.io.SAXReader;
import org.dom4j.io.XMLWriter;
import java.io.FileOutputStream;
import java.io.IOException;
class Demo {
    public static void main(String[] args) throws DocumentException, IOException {
        // 创建解析器, 得到Document
        SAXReader reader = new SAXReader();
        Document document = reader.read("demo.xml");
        // 获取根元素
        Element root = document.getRootElement();
        // 添加元素并设置内容
        Element person = root.element("person");
        Element sex = person.addElement("sex");
        sex.setText("男");
        // 回写并格式化
        OutputFormat format = OutputFormat.createPrettyPrint();
        XMLWriter xmlWriter = new XMLWriter(new FileOutputStream("demo.xml"), format);
        xmlWriter.write(document);
        xmlWriter.close();
    }
}

课时34 使用dom4j实现在在特定位置添加节点的操作

import org.dom4j.Document;
import org.dom4j.DocumentException;
import org.dom4j.DocumentHelper;
import org.dom4j.Element;
import org.dom4j.io.OutputFormat;
import org.dom4j.io.SAXReader;
import org.dom4j.io.XMLWriter;
import java.io.FileOutputStream;
import java.io.IOException;
import java.util.List;
class Demo {
    public static void main(String[] args) throws DocumentException, IOException {
        // 创建解析器, 得到Document
        SAXReader reader = new SAXReader();
        Document document = reader.read("demo.xml");
        Element root = document.getRootElement();
        // 指定位置添加元素
        Element person = root.element("person");
        List<Element> list = person.elements();
        Element sex = DocumentHelper.createElement("sex");
        sex.setText("女");
        list.add(1, sex);
        // 回写并格式化
        OutputFormat format = OutputFormat.createPrettyPrint();
        XMLWriter xmlWriter = new XMLWriter(new FileOutputStream("demo.xml"), format);
        xmlWriter.write(document);
        xmlWriter.close();
    }
}

课时35 dom4j里面封装方法的操作

package util;
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 Dom4jUtil {
    public static Document getDocument(String path) throws DocumentException {
        // 创建解析器, 得到Document
        SAXReader reader = new SAXReader();
        return reader.read(path);
    }
    public static void writeXml(String path, Document document) throws IOException {
        // 回写并格式化
        OutputFormat format = OutputFormat.createPrettyPrint();
        XMLWriter xmlWriter = new XMLWriter(new FileOutputStream(path), format);
        xmlWriter.write(document);
        xmlWriter.close();
    }
}

课时36 使用dom4j实现修改的操作

import org.dom4j.Document;
import org.dom4j.DocumentException;
import org.dom4j.Element;
import util.Dom4jUtil;
import java.io.IOException;
class Demo {
    public static void main(String[] args) throws DocumentException, IOException {
        // 创建解析器, 得到Document
        String path = "demo.xml";
        Document document = Dom4jUtil.getDocument(path);
        // 获取根元素
        Element root = document.getRootElement();
        Element peron = root.element("person");
        Element sex = peron.element("sex");
        sex.setText("男");
        // 回写并格式化
        Dom4jUtil.writeXml(path, document);
    }
}

课时37 使用dom4j实现删除节点的操作

import org.dom4j.Document;
import org.dom4j.DocumentException;
import org.dom4j.Element;
import util.Dom4jUtil;
import java.io.IOException;
class Demo {
    public static void main(String[] args) throws DocumentException, IOException {
        String path = "demo.xml";
        Document document = Dom4jUtil.getDocument(path);
        // 获取根元素
        Element root = document.getRootElement();
        Element person = root.element("person");
        Element sex = person.element("sex");
        // 通过父节点删除
        sex.getParent().remove(sex);
        // 回写并格式化
        Dom4jUtil.writeXml(path, document);
    }
}

课时38 使用dom4j实现获取属性值的操作

demo.xml

<?xml version="1.0" encoding="UTF-8"?>
<person id="001">
    <name>张三</name>
    <age>23</age>
</person>
import org.dom4j.Document;
import org.dom4j.DocumentException;
import org.dom4j.Element;
import util.Dom4jUtil;
import java.io.IOException;
class Demo {
    public static void main(String[] args) throws DocumentException, IOException {
        String path = "demo.xml";
        Document document = Dom4jUtil.getDocument(path);
        Element root = document.getRootElement();
        String id = root.attributeValue("id");
        System.out.println(id); // 001
    }
}

第6 章 : XPATH

课时39 XPATH简介

dom4j支持xpath操作

可以直接获取元素

/a/b/c             一层一层选择
//b                不管层级,直接选择b
/*                 所有元素
/a/b[1]            第一个b元素
/a/b[last()]       最后一个b元素
//b[@id]           只要有id属性 
//b[@name="bbb"]   name属性等于bbb

课时40 使用dom4j支持XPATH的操作一

jaxen

selectNode()

selectSingleNode()

demo.xml

课时40 使用dom4j支持XPATH的操作一
jaxen
selectNode()
selectSingleNode()
demo.xm

示例:得到所有name节点

import org.dom4j.Document;
import org.dom4j.DocumentException;
import org.dom4j.Node;
import util.Dom4jUtil;
import java.util.List;
class Demo {
    public static void main(String[] args) throws DocumentException {
        String path = "demo.xml";
        Document document = Dom4jUtil.getDocument(path);
        // 获取元素
        List<Node> list = document.selectNodes("//name");
        // 遍历集合
        for (Node node : list) {
            String text = node.getText();
            System.out.println(text);
        }
    }
}

课时41 使用dom4j支持XPATH的操作二

import org.dom4j.Document;
import org.dom4j.DocumentException;
import org.dom4j.Node;
import util.Dom4jUtil;
class Demo {
    public static void main(String[] args) throws DocumentException {
        String path = "demo.xml";
        Document document = Dom4jUtil.getDocument(path);
        // 获取根元素
        Node name = document.selectSingleNode("/person[@id='001']/name");
        System.out.println(name.getText());
    }
}

第7 章 : 案例

课时42-44 学生管理系统实现-添加、删除、查询操作

使用xml作为数据库,存储学生数据

依赖

<dependency>
    <groupId>org.dom4j</groupId>
    <artifactId>dom4j</artifactId>
    <version>2.0.0</version>
</dependency>

demo.xml

<?xml version="1.0" encoding="UTF-8"?>
<list>
</list>

Dom4jUtil.java

package util;
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 Dom4jUtil {
    public static Document getDocument(String path) throws DocumentException {
        // 创建解析器, 得到Document
        SAXReader reader = new SAXReader();
        return reader.read(path);
    }
    public static void writeXml(String path, Document document) throws IOException {
        // 回写并格式化
        OutputFormat format = OutputFormat.createPrettyPrint();
        XMLWriter xmlWriter = new XMLWriter(new FileOutputStream(path), format);
        xmlWriter.write(document);
        xmlWriter.close();
    }
}

Student.java

package com.pengshiyu.student;
public class Student {
    private String id;
    private String name;
    private int age;
    public Student() {
    }
    public Student(String id, String name, int age) {
        this.id = id;
        this.name = name;
        this.age = 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 int getAge() {
        return age;
    }
    public void setAge(int age) {
        this.age = age;
    }
    @Override
    public String toString() {
        return "Student{" +
                "id='" + id + '\'' +
                ", name='" + name + '\'' +
                ", age=" + age +
                '}';
    }
}

StudentService.java

package com.pengshiyu.student;
import org.dom4j.Document;
import org.dom4j.DocumentException;
import org.dom4j.Element;
import org.dom4j.Node;
import util.Dom4jUtil;
import java.io.IOException;
import java.util.List;
public class StudentService {
    private static final String path = "demo.xml";
    /**
     * 添加数据
     *
     * @param student
     * @throws DocumentException
     * @throws IOException
     */
    public static void addStudent(Student student) throws DocumentException, IOException {
        Document document = Dom4jUtil.getDocument(path);
        Element root = document.getRootElement();
        Element person = root.addElement("person");
        Element id = person.addElement("id");
        id.setText(student.getId());
        Element name = person.addElement("name");
        name.setText(student.getName());
        Element age = person.addElement("age");
        age.setText(String.valueOf(student.getAge()));
        Dom4jUtil.writeXml(path, document);
    }
    /**
     * 删除数据
     *
     * @param uid
     * @throws IOException
     * @throws DocumentException
     */
    public static void removeStudent(String uid) throws IOException, DocumentException {
        Document document = Dom4jUtil.getDocument(path);
        // 获取所有的id
        List<Node> list = document.selectNodes("//id");
        for (Node node : list) {
            String nodeId = node.getText();
            // System.out.println(nodeId);
            // 判断id相同,通过祖父节点移除父节点
            if (uid.equals(nodeId)) {
                Element parent = node.getParent();
                Element grandfather = parent.getParent();
                grandfather.remove(parent);
            }
        }
        Dom4jUtil.writeXml(path, document);
    }
    /**
     * 查询数据
     *
     * @param uid
     * @return
     * @throws IOException
     * @throws DocumentException
     */
    public static Student getStudent(String uid) throws DocumentException {
        Document document = Dom4jUtil.getDocument(path);
        // 获取所有的id
        List<Node> list = document.selectNodes("//id");
        for (Node node : list) {
            String nodeId = node.getText();
            // System.out.println(nodeId);
            // 判断id相同,通过祖父节点移除父节点
            if (uid.equals(nodeId)) {
                Element parent = node.getParent();
                Student student = new Student();
                student.setId(parent.element("id").getText());
                student.setName(parent.element("name").getText());
                student.setAge(Integer.parseInt(parent.element("age").getText()));
                return student;
            }
        }
        return null;
    }
}

StudentTest.java

package com.pengshiyu.student;
import org.dom4j.DocumentException;
import org.junit.Test;
import java.io.IOException;
public class StudentTest {
    @Test
    public void testAddStudent() throws IOException, DocumentException {
        Student student = new Student("001", "Tom", 23);
        StudentService.addStudent(student);
    }
    @Test
    public void testRemoveStudent() throws IOException, DocumentException {
        StudentService.removeStudent("001");
    }
    @Test
    public void testGEtStudent() throws IOException, DocumentException {
        Student student= StudentService.getStudent("001");
        System.out.println(student);
    }
}


相关文章
|
3月前
|
IDE Java 关系型数据库
Java 初学者学习路线(含代码示例)
本教程为Java初学者设计,涵盖基础语法、面向对象、集合、异常处理、文件操作、多线程、JDBC、Servlet及MyBatis等内容,每阶段配核心代码示例,强调动手实践,助你循序渐进掌握Java编程。
427 3
|
3月前
|
SQL Java 数据库
2025 年 Java 从零基础小白到编程高手的详细学习路线攻略
2025年Java学习路线涵盖基础语法、面向对象、数据库、JavaWeb、Spring全家桶、分布式、云原生与高并发技术,结合实战项目与源码分析,助力零基础学员系统掌握Java开发技能,从入门到精通,全面提升竞争力,顺利进阶编程高手。
616 1
|
4月前
|
安全 Java 数据库连接
2025 年最新 Java 学习路线图含实操指南助你高效入门 Java 编程掌握核心技能
2025年最新Java学习路线图,涵盖基础环境搭建、核心特性(如密封类、虚拟线程)、模块化开发、响应式编程、主流框架(Spring Boot 3、Spring Security 6)、数据库操作(JPA + Hibernate 6)及微服务实战,助你掌握企业级开发技能。
602 3
|
6月前
|
前端开发 JavaScript Java
Java 学习路线规划及项目案例中的技术栈应用解析
内容包括:**Java 17核心特性**(如sealed class、record)与模块化开发;Spring Boot 3 + Spring Cloud微服务架构,涉及响应式编程(WebFlux)、多数据库持久化(JPA、R2DBC、MongoDB);云原生技术**如Docker、Kubernetes及CI/CD流程;性能优化(GraalVM Native Image、JVM调优);以及前后端分离开发(Vue 3、Spring Boot集成)。通过全栈电商平台项目实战,掌握从后端服务(用户、商品、订单)到前端应用(Vue 3、React Native)的全流程开发。
259 9
|
6月前
|
消息中间件 Java 微服务
2025 版 Java 学习路线实战指南从入门到精通
《Java学习路线实战指南(2025版)》是一份全面的Java开发学习手册,涵盖基础环境搭建、核心语法与新特性、数据结构与算法、微服务架构、云原生技术栈、AI融合及项目实战。内容包括JDK安装配置、IntelliJ IDEA设置、Records类与模式匹配增强、LeetCode题解、Spring Cloud微服务开发、Kubernetes部署、OpenAI API调用等。结合在线商城系统案例,采用Vue 3、Spring Boot 3.5、MySQL、Elasticsearch等技术,提供从理论到实践的完整路径,助力开发者掌握2025年最新趋势与最佳实践。
468 4
|
3月前
|
SQL 算法 Java
零基础到精通的史上最强 Java 学习路线图推荐
史上最全Java学习路线图,涵盖基础语法、面向对象、数据结构与算法、多线程、JVM、Spring框架、数据库及项目实战,助你从零基础到精通Java开发,附完整代码与工具推荐。
246 3
零基础到精通的史上最强 Java 学习路线图推荐
|
3月前
|
NoSQL Java 关系型数据库
超全 Java 学习路线,帮你系统掌握编程的超详细 Java 学习路线
本文为超全Java学习路线,涵盖基础语法、面向对象编程、数据结构与算法、多线程、JVM原理、主流框架(如Spring Boot)、数据库(MySQL、Redis)及项目实战等内容,助力从零基础到企业级开发高手的进阶之路。
301 1
|
3月前
|
前端开发 Java 数据库连接
帮助新手快速上手的 JAVA 学习路线最详细版涵盖从入门到进阶的 JAVA 学习路线
本Java学习路线涵盖从基础语法、面向对象、异常处理到高级框架、微服务、JVM调优等内容,适合新手入门到进阶,助力掌握企业级开发技能,快速成为合格Java开发者。
519 3
|
4月前
|
算法 Java 测试技术
适合新手小白的史上最强 Java 学习路线图从基础到进阶全程指南
本Java学习路线图涵盖从基础语法、面向对象、集合框架到进阶编程、JVM原理、Spring Boot框架,再到数据库操作与实战项目开发,内容系统全面,适合零基础新手入门与进阶提升,助力掌握Java全栈开发技能。
370 4
|
4月前
|
Java 数据库连接 微服务
零基础自学 Java 全栈必备最全学习路线及知识清单方向指引
本文为零基础学习者提供完整的Java全栈学习路线,涵盖Java基础、进阶、框架、项目实战及拓展方向,助你系统掌握全栈开发技能,快速成长为优秀Java工程师。
532 6