在这里插入图片描述

xml入门

xml新建

1.新建java项目, 项目名xml

2.新建 students.xml文件

<?xml version="1.0" encoding="UTF-8" ?>
<!--
    老韩解读
    1 xml :表示该文件的类型 xml
    2 version="1.0"版本
    3 encoding="UTF-8" 文件编码
    4. students: root元素/根元素, 程序员自己来定
    5. <student></student> 表示students一个子元素, 可以有多个
    6. id就是属性 name, age, gender 是student元素的子元素
-->
<students>
    <student id="100">
        <name>jack</name>
        <age>10</age>
        <gender></gender>
    </student>
    <student id="200">
        <name>mary</name>
        <age>18</age>
        <gender></gender>
    </student>
</students>

文档声明

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

元素

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

属性

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

CDATA节

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

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

在这里插入图片描述

转义字符

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

格式正确的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/
在这里插入图片描述

5.本地文档: dom4j-1.6.1\docs\index.html

在这里插入图片描述

6.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

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);
    }
}

debug分析

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

遍历xml指定元素

public class Dom4j_ {
    /**
     * 遍历所有的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");
            //文本在节点的Text属性里, 要获取Student元素 的属性id
            System.out.println("学生信息= " + student.attribute("id") + name.getText() + " " + age.getText() +
                    " " + resume.getText() + " " + gender.getText());
        }
    }
}

读取指定xml元素

public class Dom4j_ {
    /**
     * 指定读取第一个学生的信息 就是 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(0);
        //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"));
    }
}

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();
    }

作业

public class Homework {
    public static void main(String[] args) throws DocumentException {

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

        //3.遍历所有的book元素
        List<Element> books = document.getRootElement().elements("book");
        for (Element book : books) {
            //取出book元素的所有信息
            Element name = book.element("name");
            Element author = book.element("author");
            Element price = book.element("price");
            String id = book.attributeValue("id");
            //创建成Book对象
            Book book1 = new Book();
            book1.setId(Integer.parseInt(id));
            book1.setName(name.getText());
            book1.setPrice(Double.parseDouble(price.getText()));
            book1.setAuthor(author.getText());
            System.out.println("book1对象信息= " + book1);
        }
    }
}
Logo

有“AI”的1024 = 2048,欢迎大家加入2048 AI社区

更多推荐