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
<?xml version="1.0" encoding="UTF-8"?>
<person id="001">
    <name>张三</name>
    <age>23</age>
</person>

示例:得到所有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天前
|
XML JavaScript 前端开发
XML DOM 节点信息
XML DOM提供nodeName、nodeValue和nodeType属性来揭示节点详情。一个JavaScript示例展示了如何运用这些属性:loadXMLDoc函数加载XML文件&quot;books.xml&quot;,然后通过nodeName获取根元素名,用nodeValue提取文本节点的内容。
|
4天前
|
XML JavaScript 数据格式
XML DOM 浏览器差异
不同浏览器对XML DOM解析处理存在差异,尤其是在处理空白和换行方面。当XML文档中包含换行和空格时,Internet Explorer不会将这些视为文本节点,而其他浏览器则会。例如,一个简单的XML文档在各子节点间有空格和换行,IE会识别为4个子节点,而其他浏览器则识别为9个。示例代码通过加载XML文件并输出子节点数量来展示这一差异。
|
6天前
|
XML JavaScript 数据格式
XML DOM 节点列表
`getElementsByTagName()` 和 `childNodes` 返回 XML DOM 中的节点列表,表现为按顺序排列的节点集合。节点通过 0 开始的索引访问。例如,以下代码加载 &quot;books.xml&quot;,获取所有 `&lt;title&gt;` 元素的节点列表,然后提取第一个 `&lt;title&gt;` 的文本内容:`xmlDoc.getElementsByTagName(&quot;title&quot;)[0].childNodes[0].nodeValue`,结果为 &quot;Everyday Italian&quot;。
|
8天前
|
XML JavaScript 前端开发
XML DOM 节点信息
XML DOM 节点详解:nodeName、nodeValue 和 nodeType 属性用于获取和操作节点信息。示例展示如何加载XML文件,如books.xml,通过loadXMLDoc函数。nodeName获取元素节点名,nodeValue用于获取或设置文本节点内容,nodeType显示节点类型(如元素:1,属性:2,文本:3,注释:8,文档:9)。每个节点都是可访问和操作的对象,包含方法和属性。
|
22小时前
|
XML Web App开发 JavaScript
XML DOM 解析器
XML解析器是浏览器内置的工具,用于将XML转换为JavaScript可操作的XML DOM对象。通过DOM,可以进行节点的遍历、访问和修改。以下JS代码示例展示了如何加载XML文档&quot;books.xml&quot;:首先检查XMLHttpRequest支持,然后创建请求对象,打开并发送GET请求,最后将响应转化为DOM对象。
|
2天前
|
XML Web App开发 JavaScript
XML DOM 解析器
XML解析器是浏览器内置工具,用于将XML转换为JavaScript可操作的XML DOM对象,允许遍历、修改节点。大多数现代浏览器支持这一功能。以下JS代码示例展示了如何加载XML文档&quot;books.xml&quot;
|
4天前
|
XML Web App开发 JavaScript
XML DOM - 导航节点
在XML DOM中,导航节点涉及利用parentNode、childNodes、firstChild、lastChild、nextSibling和previousSibling属性来遍历节点树。不同浏览器对空文本节点处理不一致,可能导致导航问题。为解决此问题,可以使用get_nextSibling函数,它检查并跳过非元素类型的空文本节点,确保在IE和Firefox等浏览器中得到一致的结果。该函数循环遍历直到找到下一个元素节点。
|
5天前
|
XML JavaScript 前端开发
XML DOM 遍历节点树
该示例展示了如何遍历XML文档的节点树。通过DOMParser解析XML字符串得到xmlDoc,然后遍历根节点的子节点,显示每个节点的名称及其文本值。输出结果为:&quot;title: Everyday Italian&quot;, &quot;author: Giada De Laurentiis&quot;, &quot;year: 2005&quot;。代码使用JavaScript实现,循环遍历并更新HTML元素`&lt;p id=&quot;demo&quot;&gt;&lt;/p&gt;`的内容。
|
8天前
|
XML JavaScript 前端开发
XML DOM 节点信息
XML DOM中的每个节点都是一个具有方法和属性的对象,可通过JavaScript操作。关键属性有:nodeName(定义节点名称,如元素、属性或#text)、nodeValue(提供节点值,如文本或属性值)和nodeType。元素节点的nodeName等于标签名,属性节点的nodeName是属性名。文本节点的nodeValue是其文本内容,而文档节点的nodeName是&quot;#document&quot;。示例代码演示了如何获取第一个&lt;title&gt;元素的文本值。
|
9天前
|
XML 存储 JavaScript
XML DOM - 访问节点
使用DOM,可以访问XML文档的每个节点。访问方法包括:通过getElementsByTagName(),遍历节点树和导航节点关系。getElementsByTagName()返回一个Node List,它是节点数组,可用于按索引访问元素,如`x[2]`获取第三个&lt;title&gt;元素。后续章节将进一步探讨Node List。