1. 概述

1.1. 引言

首先,我们来认识一下,什么是XML?

XML是可扩展的标记语言( Extensible Markup Language ),意思是它是由一些标签组成的,而这些标签是自己定义的。本质上是一种数据格式,可以用来表示复杂的数据关系。

XML文件有如下的特点:

  • XML中的<标签名> 称为一个标签或者一个元素,一般是成对出现的。
  • XML中的标签名可以自己定义(可扩展),但是必须要正确的嵌套
  • XML中只能有一个根标签。
  • XML标准中可以有属性
  • XML必须第一行有一个文档声明,格式是固定的<?xml version="1.0" encoding="UTF-8"?>
  • XML文件必须是以.xml为后缀结尾
<?xml version="1.0" encoding="UTF-8" ?>
<!-- 注释:以上抬头声明必须放在第一行,必须有 -->
<!--  根标签只能有一个 -->
<users>
    <user id="1" desc="第一个用户">
        <name>张无忌</name>
        <sex>男</sex>
        <地址>光明顶</地址>
        <password>minmin</password>
    </user>
    <people>很多人</people>
    <user id="2">
        <name>敏敏</name>
        <sex>女</sex>
        <地址>光明顶</地址>
        <password>wuji</password>
    </user>
</users>

上面XML文件中的数据格式是最为常见的,标签有属性、文本、还有合理的嵌套。XML文件中除了写以上的数据格式之外,还有一些特殊的字符不能直接写。

那么,XML在实际开发中有什么作用?

  • 1 传输数据
  • 2 作为一些框架的配置信息文件 比如logback.xml

1.2. 处理特殊符号

  • <,>,& 等这些符号不能出现在标签的文本中,因为标签格式本身就有<>,会和标签格式冲突。

    如果标签文本中有这些特殊字符,需要用一些占位符代替。

    <  表示 <
    >  表示 >
    & 表示 &
    ' 表示 '
    " 表示 "
     3 < 2 && 5 > 4 
  • 如果在标签文本中,出现大量的特殊字符,不想使用特殊字符,此时可以用CDATA区,格式如下

    • idea快捷提示是 CD
    
         4
        ]]>
    

2. XML解析

2.1. 概念

所谓的xml解析,就是从xml中获取到数据

  • 常见的解析思想

    DOM(Document Object Model)文档对象模型:就是把文档的各个组成部分看做成对应的对象。
    会把xml文件全部加载到内存,在内存中形成一个树形结构,再获取对应的值

    02\_dom解析概述

  • 常见的解析工具

    • JAXP: SUN公司提供的一套XML的解析的API
    • JDOM: 开源组织提供了一套XML的解析的API-jdom
    • DOM4J: 开源组织提供了一套XML的解析的API-dom4j,全称:Dom For Java,目前使用最多的
    • Jsoup:功能强大DOM方式的XML解析开发包,尤其对HTML解析更加方便(项目中讲解)
  • 解析的准备工作

    1. 我们可以通过网站:https://dom4j.github.io/ 去下载dom4j

      今天的资料中已经提供,我们不用再单独下载了,直接使用即可

    2. 将提供好的dom4j-1.6.1.zip解压,找到里面的dom4j-1.6.1.jar

    3. 在idea中当前模块下新建一个lib文件夹,将jar包复制到文件夹中

    4. 选中jar包 -> 右键 -> 选择add as library即可

  • DOM4j的API介绍

    解析过程中必须记住的几个单词:Document文档 Element标签 Attribute属性

    • SaxReader对象
    返回值 方法名 说明
    SAXReader new SAXReader() 构造器
    Document Document read(String url) 加载执行xml文档
    • Document对象
    返回值 方法名 说明
    Element getRootElement() 获得根元素
    • Element对象
    返回值 方法名 说明
    List elements([String ele] ) 获得指定名称的所有子元素。可以不指定名称
    Element element([String ele]) 获得指定名称第一个子元素。可以不指定名称
    String getName() 获得当前元素的元素名
    String attributeValue(String attrName) 获得指定属性名的属性值
    String elementText(Sting ele) 获得指定名称子元素的文本值
    String getText() 获得当前元素的文本内容

2.2. 案例

2.2.1. 需求

  • 解析提供好的xml文件
  • 将解析到的数据封装到学生对象中
  • 并将学生对象存储到ArrayList集合中
  • 遍历集合

2.2.2. 代码

XML

<?xml version="1.0" encoding="UTF-8" ?>
<!--注释的内容-->
<!--本xml文件用来描述多个学生信息-->
<students>

    <!--第一个学生信息-->
    <student id="1">
        <name>张三</name>
        <age>23</age>
    </student>

    <!--第二个学生信息-->
    <student id="2">
        <name>李四</name>
        <age>24</age>
    </student>

</students>

实体类

@Data
public class Student {
    private String id;
    private String name;
    private int age;
}

业务方法

/**
 * 利用dom4j解析xml文件
 */
import org.dom4j.Attribute;
import org.dom4j.Document;
import org.dom4j.DocumentException;
import org.dom4j.Element;
import org.dom4j.io.SAXReader;
import java.util.List;

public class Demo01 {
    public static void main(String[] args) throws DocumentException {
        SAXReader reader = new SAXReader();

        // 1加载文件 获取文档document对象
        Document document = reader.read("mymodule/stus.xml");

        // 2获取根标签
        Element root = document.getRootElement();

        // 3获取根标签的子标签
        List<Element> elements = root.elements();

        ArrayList<Student> stus = new ArrayList<>();

        for (Element element : elements) {
            //element是每一个子元素
            // System.out.println(element);

            //获取属性Attribute对象
            // Attribute idattribute = element.attribute("id");
            //23
            // System.out.println(idattribute.getValue());

            //直接获取属性id的值
            String id = element.attributeValue("id");

            //先获取标签对象 再获取文本
            // Element nameElement = element.element("name");
            // System.out.println(nameElement.getText());

            //直接获取标签文本
            String name = element.elementText("name");
            String age = element.elementText("age");

             //封装为学生对象
            stus.add(new Student(id, name, Integer.parseInt(age)));
        }

    }
}

3. XML约束

3.1. 概述

首先,什么是XML约束?

XML约束指的是限制XML文件中的标签或者属性,只能按照规定的格式写。

比如我在项目中,想约束一个XML文件中的标签只能写<书>、<书名>、<作者>、<售价>这几个标签,如果写其他标签就报错。

1668001422123

3.2. 实现方案

怎么才能达到上面的效果呢?有两种约束技术,一种是DTD约束、一种是Schame约束。

DTD约束案例

如下图所示book.xml中引入了DTD约束文件,book.xml文件中的标签就受到DTD文件的约束

1668001621567

DTD文件解释

   表示根标签是<书架>,并且书架中有子标签<书>
 表示书是一个标签,且书中有子标签<书名>、<作者>、<售价>
  表示<书名>是一个标签,且<书名>里面是普通文本
  表示<作者>是一个标签,且<作者>里面是普通文本
  表示<售价>是一个标签,且<售价>里面是普通文本

Schame约束案例

如下图所示,左边的book2.xml文件就受到右边schame文件(.xsd结尾的文件)的约束。

1668001745089

  • 在一些框架中,框架会给出如何引入约束,我们需要引入然后按规则写xml
如人饮水,冷暖自知。
最后更新于 2023-08-05