XML要点总结

一、XML****技术用于解决什么问题

● 解决程序间数据传输的问题: => json
比如 qq 之间的数据传送,用 xml 格式来传送数据,具有良好的可读性,可维护性。
● xml 可以做 配置文件
xml 文件做配置文件可以说非常的普遍,比如我们的 tomcat 服务器的 server.xml , web.xml
● xml 可以充当小型的数据库 => 程序自己的数据格式存放
xml 文件做小型数据库,也是不错的选择,我们程序中可能用到的数据,如果放在数据库
中读取不合适 ( 因为你要增加维护数据库工作 ) ,可以考虑直接用 xm 来做小型数据库 ,而且
直接读取文件显然要比读取数据库快

二、DOM4j

1.XML 解析技术原理

(1) 不管是 html 文件还是 xml 文件它们都是标记型文档,都可以使用 w3c 组织制定的
dom 技术来解析
(2)document 对象表示的是整个文档(可以是 html 文档,也可以是 xml 文档)

2.DOM4J 介绍

(1) Dom4j 是一个简单、灵活的开放源代码的库 ( 用于解析 / 处理 XML 文件 ) 。 Dom4j 是由早期
开发 JDOM 的人分离出来而后独立开发的。
(2)与 JDOM 不同的是, dom4j 使用接口和抽象基类,虽然 Dom4j 的 API 相对要复杂一些,
但它提供了比 JDOM 更好的灵活性。
(3) Dom4j 是一个非常优秀的 Java XML API ,具有性能优异、功能强大和极易使用的特点。
现在很多软件采用的 Dom4j 。
(4)使用 Dom4j 开发,需下载 dom4j 相应的 jar 文件

3.DOM4j 中,获得 Document 对象的方式有三种

● 开发 dom4j 要导入 dom4j 的包
(1)读取 XML 文件 , 获得 document 对象
SAXReader reader = new SAXReader();
// 创建一个解析器
Document document = reader.read(new File(" src/input.xml "));//XML Document
(2)解析 XML 形式的文本 , 得到 document 对象
String text = "<members></members>";
Document document = DocumentHelper.parseText(text);
(3)主动创建 document 对象 .
Document document = DocumentHelper.createDocument();
// 创建根节点
Element root = document.addElement("members");

4.DOM4j****应用实例

XML 复制代码
<?xml version="1.0" encoding="utf-8"?>

<students> 
  <student id="01"> 
    <name>小龙女</name>  
    <gender>女</gender>  
    <age>19</age>  
    <resume>古墓派掌门人</resume> 
  </student>  
  <student id="02"> 
    <name>欧阳锋</name>  
    <gender>男</gender>  
    <age>21</age>  
    <resume>白驼山,蛤蟆神功</resume> 
  </student> 
</students>
java 复制代码
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 org.junit.jupiter.api.Test;

import java.io.File;
import java.io.FileOutputStream;
import java.util.List;

/**
 * @author 韩顺平
 * @version 1.0
 */
public class Dom4j_ {

    /**
     * 演示如何加载xml文件
     */
    @Test
    public void loadXML() throws DocumentException {
        //得到一个解析器
        SAXReader reader = new SAXReader();
        //老师的代码技巧->debug 看看document对象的属性
        //分析了document对象的底层结构
        Document document = reader.read(new File("src/students.xml"));
        System.out.println(document);

    }

    /**
     * 遍历所有的student信息
     */
    @Test
    public void listStus() throws DocumentException {
        //得到一个解析器
        SAXReader reader = new SAXReader();
        //老师的代码技巧->debug 看看document对象的属性
        //分析了document对象的底层结构
        Document document = reader.read(new File("src/students.xml"));

        //1. 得到rootElement, 你是OOP
        Element rootElement = document.getRootElement();
        //2. 得到rootElement的student Elements
        List<Element> students = rootElement.elements("student");
        //System.out.println(student.size());//2
        for (Element student : students) {//element就是Student元素/节点
            //获取Student元素 的name Element
            Element name = student.element("name");
            Element age = student.element("age");
            Element resume = student.element("resume");
            Element gender = student.element("gender");

            System.out.println("学生信息= " + name.getText() + " " + age.getText() +
                    " " + resume.getText() + " " + gender.getText());
        }

    }

    /**
     * 指定读取第一个学生的信息 就是 dom4j+xpath
     */
    @Test
    public void readOne() throws DocumentException {

        //得到一个解析器
        SAXReader reader = new SAXReader();
        //老师的代码技巧->debug 看看document对象的属性
        //分析了document对象的底层结构
        Document document = reader.read(new File("src/students.xml"));

        //1. 得到rootElement, 你是OOP
        Element rootElement = document.getRootElement();

        //2. 获取第一个学生
        Element student = (Element) rootElement.elements("student").get(1);
        //3. 输出该信息
        System.out.println("该学生的信息= " + student.element("name").getText() + " " +
                student.element("age").getText() + " " + student.element("resume").getText() +
                student.element("gender").getText());

        //4. 获取student元素的属性
        System.out.println("id= " + student.attributeValue("id"));
    }

    /**
     * 加元素(要求: 添加一个学生到xml中) [不要求,使用少,了解]
     * @throws Exception
     */
    @Test
    public void add() throws Exception {

        //1.得到解析器
        SAXReader saxReader = new SAXReader();
        //2.指定解析哪个xml文件
        Document document = saxReader.read(new File("src/students.xml"));


        //首先我们来创建一个学生节点对象
        Element newStu = DocumentHelper.createElement("student");
        Element newStu_name = DocumentHelper.createElement("name");
        //如何给元素添加属性
        newStu.addAttribute("id", "04");
        newStu_name.setText("宋江");
        //创建age元素
        Element newStu_age = DocumentHelper.createElement("age");
        newStu_age.setText("23");
        //创建resume元素
        Element newStu_intro = DocumentHelper.createElement("resume");
        newStu_intro.setText("梁山老大");

        //把三个子元素(节点)加到 newStu下
        newStu.add(newStu_name);
        newStu.add(newStu_age);
        newStu.add(newStu_intro);
        //再把newStu节点加到根元素
        document.getRootElement().add(newStu);
        //直接输出会出现中文乱码:
        OutputFormat output = OutputFormat.createPrettyPrint();
        output.setEncoding("utf-8");//输出的编码utf-8

        //把我们的xml文件更新
        // lets write to a file
        //new FileOutputStream(new File("src/myClass.xml"))
        //使用到io编程 FileOutputStream 就是文件字节输出流
        XMLWriter writer = new XMLWriter(
                new FileOutputStream(new File("src/students.xml")), output);
        writer.write(document);
        writer.close();

    }

    /**
     * //删除元素(要求:删除第一个学生) 使用少,了解
     * @throws Exception
     */
    @Test
    public void del() throws Exception {
        //1.得到解析器
        SAXReader saxReader = new SAXReader();
        //2.指定解析哪个xml文件
        Document document = saxReader.read(new File("src/students.xml"));
        //找到该元素第一个学生
        Element stu = (Element) document.getRootElement().elements("student").get(2);
        //删除元素
        stu.getParent().remove(stu);
//        //删除元素的某个属性
//        stu.remove(stu.attribute("id"));
        //更新xml
        //直接输出会出现中文乱码:
        OutputFormat output = OutputFormat.createPrettyPrint();
        output.setEncoding("utf-8");//输出的编码utf-8
        //把我们的xml文件更新
        XMLWriter writer = new XMLWriter(
                new FileOutputStream(new File("src/students.xml")), output);
        writer.write(document);
        writer.close();
        System.out.println("删除成功~");
    }


    /**
     * //更新元素(要求把所有学生的年龄+3) 使用少,了解
     * @throws Exception
     */
    @Test
    public void update() throws Exception {

        //1.得到解析器
        SAXReader saxReader = new SAXReader();
        //2.指定解析哪个xml文件
        Document document = saxReader.read(new File("src/students.xml"));
        //得到所有学生的年龄
        List<Element> students = document.getRootElement().elements("student");
        //遍历, 所有的学生元素的age+3
        for (Element student : students) {
            //取出年龄
            Element age = student.element("age");
            age.setText((Integer.parseInt(age.getText()) + 3) + "");
        }

        //更新
        //直接输出会出现中文乱码:
        OutputFormat output = OutputFormat.createPrettyPrint();
        output.setEncoding("utf-8");//输出的编码utf-8

        //把我们的xml文件更新
        XMLWriter writer = new XMLWriter(
                new FileOutputStream(new File("src/students.xml")), output);
        writer.write(document);
        writer.close();
        System.out.println("更新成功~");
    }
}
相关推荐
man20175 分钟前
【2024最新】基于Python+Mysql+django的水果销售系统Lw+PPT
数据库·mysql·django
度假的小鱼10 分钟前
01 Oracle 基本操作
数据库·oracle
张声录111 分钟前
【ETCD】【实操篇(十)】基于 ETCD 实现一个简单的服务注册及发现功能
数据库·etcd
张声录113 分钟前
【ETCD】【实操篇(十八)】ETCD监控实战:提升系统健康与集群调试效率
数据库·chrome·etcd
SelectDB技术团队18 分钟前
Apache Doris 创始人:何为“现代化”的数据仓库?
大数据·数据库·数据仓库·数据分析·doris
Suwg20943 分钟前
《手写Mybatis渐进式源码实践》实践笔记(第七章 SQL执行器的创建和使用)
java·数据库·笔记·后端·sql·mybatis·模板方法模式
丁总学Java1 小时前
优化 invite_codes 表的 SQL 创建语句
java·数据库·sql
hmbbpdx1 小时前
MySql B树 B+树
数据库·b树·mysql
编程阿布1 小时前
Python基础——多线程编程
java·数据库·python
冰镇毛衣1 小时前
4.5 数据表的外连接
数据库·sql·mysql