JavaWeb系列四: XML 和 DOM4J


在这里插入图片描述

1. xml入门

1.1 xml新建

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

1.1 文档声明

  1. XML声明放在XML文档的第一行
  2. XML声明由以下几个部分组成:
  3. version=“1.0” 文档符合XML1.0规范, 我们学习1.0
  4. encoding=“utf-8” 文件字符编码

1.2 元素

  1. 空标签 <a/>是允许的;
  2. <student> 标签/元素/节点, 叫法是一样的;
  3. <Email>和<email>是两个不同的标记. 区分大小写;
  4. 标签不能嵌套;
  5. 标签不能以数字开头;
  6. 不能包含空格, 可用下划线分隔;
  7. 不能包含冒号 :

1.3 属性

  1. id = ‘1’ 单引号也是正确写法;
  2. 如果属性值有" 则用’包括, 比如 id=“00’1”; 如果属性值有’ 则用"包括, 比如 id=‘00"1’
  3. 属性名在同一个元素标记中只能出现一次<student id=‘01’ id=‘02’>是错误的
  4. 属性值不能包含 &字符, 可以包含其它特殊字符

1.4 CDATA节

如果希望把某些字符串, 当作普通文本, 使用CDATA包括

    <!--如果希望把某些字符串, 当作普通文本, 使用CDATA包括-->
    <![CDATA[
        <student id="002">
            <name>mary</name>
            <age>22</age>
            <gender>女</gender>
        </student>
    ]]>

在这里插入图片描述

1.5 转义字符

转义符符号
&lt;<
&gt;>
&amp;&
&quot;"
&apos;'

1.6 格式正确的XML

  1. XML声明语句<?xml version=“1.0” encoding=“utf-8”?>
  2. 必须有且仅有一个根元素
  3. 标记大小写
  4. 属性值用引号
  5. 标记成对
  6. 标记记得关闭
  7. 元素正确嵌套

DOM4J

DOM4J介绍

1.Dom4j 是一个简单, 灵活的开放源代码的库(用于解析 / 处理XML文件). Dom4j 是由早期开发JDOM的人分离出来而后独立开发的.

2.与JDOM不同的是, dom4j使用接口和抽象基类, 虽然Dom4jAPI相对要复杂一些, 但它提供了比JDOM更好的灵活性.

3.Dom4j是一个非常优秀的Java XML API, 具有性能优异, 功能强大和极易使用的特点. 现在很多软件采用的Dom4j.

4.使用Dom4j开发, 需下载dom4j相应的jar文件.

文档: https://dom4j.github.io/javadoc/1.6.1/
在这里插入图片描述

本地文档: dom4j-1.6.1\docs\index.html
在这里插入图片描述

Dom4j中, 获得Document对象的三种方式

1.读取XML文件, 获得document对象
SAXReader reader = new SAXReader(); //创建解析器
Document document = read.read(new File(“src/input.xml”)); //XML Document

2.解析XML形式的文本, 得到document对象
String text = “<members></members>;”
Documeng document = DocumentHelper.parseText(text);

3.主动创建document对象
Document document = DocumentHelper.createDocument(); //创建根节点
Element root = document.addElement(“members”);

Dom4j应用实例

1.使用DOM4Jstudents.xml文件进行增删改查

  • 重点讲解查询(遍历和指定查询)
  • xml增删改使用少, 作为扩展, 给出案例

2.xml 项目下新建lib文件夹, 引入dom4j依赖的jardom4j-1.6.1.jar

3.右键该jar包, 点击Add As Library
在这里插入图片描述

4.创建src/students.xml
在这里插入图片描述

<?xml version="1.0" encoding="utf-8" ?>
<students>
    <student id="01">
        <name>小龙女</name>
        <gender></gender>
        <age>16</age>
        <resume>古墓派掌门人</resume>
    </student>
    <student id="02">
        <name>欧阳锋</name>
        <gender></gender>
        <age>18</age>
        <resume>白驼山, 蛤蟆神功</resume>
    </student>
</students>

5.src/Dom4j_.java


代码
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

2.2 遍历xml指定元素

在这里插入图片描述

2.3 读取指定xml元素

/*指定读取第一个学生的信息*/
    @Test
    public void readOne() throws DocumentException {
        //获取解析器
        SAXReader reader = new SAXReader();
        Document document = reader.read(new File("src/students.xml"));
        //1.获取rootElement
        Element rootElement = document.getRootElement();
        //2.获取第一个学生
        Element student = (Element) rootElement.elements("student").get(0);
        //3.遍历student元素的节点并输出各个子节点的Text属性
        Element name = student.element("name");
        Element age = student.element("age");
        Element gender = student.element("gender");
        System.out.println("name=" + name.getText() + " age=" + age.getText() + " gender=" + gender.getText());
        //4.获取指定 student元素/节点 的属性值
        System.out.println("id=" + student.attributeValue("id"));
    }

2.4 获取属性

attributeValue

获取指定 student元素/节点 的属性值
System.out.println("id=" + student.attributeValue("id"));

2.5 dom4j增删改

  • 添加
    /*添加一个学生节点到xml文件中*/
    @Test
    public void add() throws DocumentException, IOException {
        //1.拿到解析器
        SAXReader reader = new SAXReader();
        //2.指定解析哪个Xml文件
        Document document = reader.read(new File("src/students.xml"));

        //3.首先创建一个学生节点对象
        Element student = DocumentHelper.createElement("student");
        // 创建name, age, gender子节点
        Element student_name = DocumentHelper.createElement("name");
        Element student_age = DocumentHelper.createElement("age");
        Element student_gender = DocumentHelper.createElement("gender");
        // 如何给元素添加属性
        student.addAttribute("id", "003");
        student_name.setText("威震天");
        student_age.setText("40000");
        student_gender.setText("机器族");

        //4.把三个子元素添加到student节点下
        student.add(student_name);
        student.add(student_age);
        student.add(student_gender);
        // 再把student节点挂载到rootElement下
        document.getRootElement().add(student);

        // 直接输出会中文乱码
        OutputFormat outputFormat = OutputFormat.createPrettyPrint();
        outputFormat.setEncoding("utf-8");

        //5.使用到IO编程 文件字节输出流
        XMLWriter Writer =
                new XMLWriter(new FileOutputStream(new File("src/students.xml")), outputFormat);
        Writer.write(document);
        Writer.close();
    }
  • 删除
    /*删除元素 删除最后一个学生信息*/
    @Test
    public void delete() throws DocumentException, IOException {
        //1.拿到解析器
        SAXReader reader = new SAXReader();
        //2.指定解析哪个Xml文件
        Document document = reader.read(new File("src/students.xml"));
        //3.找到最后一个学生节点
        Element student = (Element) document.getRootElement().elements("student").get(2);
        //拿到父节点 删除元素
        student.getParent().remove(student);

        //直接输出会中文乱码
        OutputFormat output = OutputFormat.createPrettyPrint();
        output.setEncoding("utf-8");
        //更新Xml文件
        XMLWriter writer = new XMLWriter(
                new FileOutputStream(new File("src/students.xml")), output);
        writer.write(document);
        writer.close();
    }
  • 修改
/*修改元素(所有元素的age+3)*/
    @Test
    public void update() throws DocumentException, IOException {
        //1.拿到解析器
        SAXReader reader = new SAXReader();
        //2.指定解析哪个Xml文件
        Document document = reader.read(new File("src/students.xml"));
        //3.拿到所有的student元素
        List<Element> students = document.getRootElement().elements("student");
        //遍历
        for (Element student : students) {
            //设置所有学生的年龄
            Element age = student.element("age");
            age.setText(Integer.parseInt(age.getText()) + 3 + "");
        }
        //直接输出会中文乱码
        OutputFormat output = OutputFormat.createPrettyPrint();
        output.setEncoding("utf-8");
        //4.IO流 文件字节输出流
        XMLWriter writer = new XMLWriter(
                new FileOutputStream(new File("src/students.xml")), output);
        writer.write(document);
        writer.close();
    }

2.6 作业

//1.拿到解析器
        SAXReader reader = new SAXReader();
        //2.指定解析books.xml文件
        Document document = reader.read(new File("src/books.xml"));
        //拿到rootElement下的 book元素
        List<Element> books = document.getRootElement().elements("book");

        ArrayList<Book> list = new ArrayList<>();
        Book book1 = null;
        int id = 0;
        String name = "";
        String author = "";
        double price = 0;

        //循环遍历 book节点
        for (Element book : books) {
            id = Integer.parseInt(book.attributeValue("id"));
            name = book.element("name").getText();
            author = book.element("author").getText();
            price = Double.parseDouble(book.element("price").getText());
            book1 = new Book(id, name, author, price);
            list.add(book1);
        }
        for (int i = 0; i < list.size(); i++) {
            Book book = list.get(i);
            System.out.println("编号 " + book.getId() + "\t\t作者 " + book.getAuthor() +
                    "\t\t书名 " + book.getName() + "\t\t价格 " + book.getPrice());
        }
  • 5
    点赞
  • 35
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

~ 小团子

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

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

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

打赏作者

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

抵扣说明:

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

余额充值