【XML详解】

XML基本概念

  • XML(全称EXtensible Markup Language,可扩展标记语言):是一种用于存储和传输数据的标记语言,通过标签(tags)来定义数据的结构和含义。
  • 数据格式:XML本质上是一种数据的格式,它可以用来存储复杂的数据结构以及数据之间的关系。

XML文件的特点

  1. 开始标签和结束标签 :XML文件的结构通常以开始标签和结束标签的形式呈现,例如<users></users>
  2. 注释 :XML文件允许包含注释,这些注释以<!--开始,以-->结束,例如<!--这是注释-->
  3. 版本信息 :XML文件通常包含版本信息,例如<?xml version="1.0" encoding="UTF-8"?>,这表明文件遵循XML 1.0规范,并使用UTF-8编码。
  4. 根标签 :XML文件中只能有一个根标签,它是所有其他标签的父标签,例如<users>
  5. 标签名和属性 :XML中的标签名(如<user><name>等)可以自行定义(即可扩展),但标签必须正确嵌套。标签还可以有属性(如<user id="1">中的id="1"),用于提供关于标签的额外信息。
  6. 编码:XML文件可以使用不同的编码来保存字符,但UTF-8编码因其兼容性和灵活性而被广泛使用。

XML文件示例

<?xml version="1.0" encoding="UTF-8"?>
<users>
    <user id="1">
        <name>黄策吾</name>
        <password>123456789</password>
        <address>城固</address>
        <sex>男</sex>
    </user>
    <user id="2">
        <name>赵敏</name>
        <password>8888</password>
        <address>光明小区</address>
        <sex>女</sex>
    </user>
</users>

在这个示例中,<users>是根标签,它包含了两个<user>标签,每个<user>标签代表一个用户,并包含用户的idnamepasswordaddresssex信息。

IDEA创建XML文件

XMI语法规则详解

XML文件的基本规则

  • 后缀名 :XML文件的后缀名通常为.xml
  • 文档声明 :XML文档的第一行必须是文档声明,它指定了XML的版本和编码方式。
    例如:<?xml version="1.0" encoding="UTF-8"?>
  • 版本号和编码
    • version:指定XML的默认版本号码,通常是1.0,这个属性是必须存在的。
    • encoding:指定本XML文件的编码方式,常用的有UTF-8GBK等。

特殊字符的转义

  • 在XML中,某些字符(如<&>'")具有特殊含义,如果需要在文本中直接使用这些字符,需要使用它们的转义序列来替代。例如:
    • &lt; 小于号<
    • &gt; 大于号>
    • &amp; 和 号&
    • ' 单引号'
    • &quot; 双引号"

CDATA区

  • CDATA区(Character Data Section)允许在XML文档中直接包含不需要被解析器解析的文本。CDATA区以 **++<![CDATA[++` `** 开头,以**++]]>++ **结束。在CDATA区内的文本,包括特殊字符,都将被视为普通文本处理,不会进行任何转义或解析。啊?

XML的应用

XML的作用

  1. 数据交换:XML可以作为不同系统或应用之间交换数据的标准格式。由于其结构化和可扩展性,它能够清晰地表示复杂的数据结构,使得数据交换更加高效和准确。
  2. 数据存储:XML可以作为数据的存储格式,尤其是在需要保持数据结构和内容清晰易读时。虽然它不如数据库系统高效,但在某些情况下(如配置文件),XML的易用性和可读性使其成为首选。
  3. 网络传输:在网络通信中,XML常被用作传输数据的格式。其结构化特性使得数据在网络中传输时更加可靠和易于解析。

XML的应用场景

  1. 配置文件:XML常被用作配置文件的格式,因为它允许用户自定义标签,从而以清晰、灵活的方式描述配置项。
  2. Web服务:在Web服务中,XML是SOAP(Simple Object Access Protocol)消息的基础,用于在Web上交换结构化信息。
  3. 数据表示:XML可用于表示各种类型的数据,如书籍、音乐、天气信息等。由于其可扩展性,XML能够灵活地适应各种数据结构和需求。
  4. 应用程序之间的通信:不同应用程序之间可以通过XML交换数据,从而实现功能集成和数据共享。

解析XML文件

使用Dom4j解析出xml文件

  • 下载Dom4j框架:指导用户从官网下载Dom4j库,这是实现XML解析功能的前提。
  • 项目文件夹设置
    1. 在项目中创建一个名为"lib"的文件夹,用于存放第三方库文件。
    2. 将下载的dom4j-2.1.3.jar文件(或其他版本)复制到lib文件夹中。
    3. 在jar文件上右键操作,选择"Add as Library"并确认,以便将Dom4j库添加到项目的依赖中。
  • 在类中导包使用:在Java代码中,通过import语句导入Dom4j库的相关类,以便在代码中使用其提供的API进行XML解析。

Dom4j的DOM实现

只能自上而下层层解析

Dom4j在解析XML文件时,采用了DOM的思想,但相比于传统的DOM解析器,Dom4j提供了更简洁、更高效的API。以下是Dom4j解析XML文件并构建文档对象模型的主要步骤:

  1. 创建解析器
    • Dom4j使用SAXReader类作为主要的解析器。SAXReader能够读取XML文件或输入流,并将其解析成一个Document对象。
  2. 读取XML文件
    • 通过SAXReader的read()方法,可以读取XML文件或输入流,并返回一个Document对象。++这个Document对象代表了整个XML文档的根节点。++
  3. 构建文档对象模型
    • Document对象是一个树形结构的根,它包含了XML文档中的所有节点。这些节点可以是元素节点(Element)、属性节点(Attribute)、文本节点(Text)等。
    • 通过Document对象,可以访问XML文档的根元素,并进一步遍历整个文档树,获取或修改其中的节点和属性。
  4. 遍历文档树
    • Dom4j提供了多种遍历文档树的方法,如使用elementIterator()遍历元素节点,使用attributeIterator()遍历属性节点等。
    • 开发者可以根据需要选择合适的遍历方法,以访问和处理XML文档中的特定节点和属性。
  5. 操作XML文档
    • 除了读取和遍历XML文档外,Dom4j还允许开发者对XML文档进行增删改查等操作。
    • 例如,可以使用addElement()方法添加新的元素节点,使用setText()方法修改节点的文本内容,使用remove()方法删除节点等。

代码详解过程

import org.dom4j.Document;
import org.dom4j.Element;
import org.dom4j.io.SAXReader;

public class MainXML {
    public static void main(String[] args) throws Exception {
        //1、创建一个Dom4j框架提供的解析器对象
        SAXReader saxReader=new SAXReader();
        
        //2、使用saxReader对象把XML文件读成一个Document对象
        Document document=
                saxReader.read("E:\\code\\javese\\summerVacation\\src\\666.xml");
        
        //3、从文档对象中解析XML文件的全部数据。
        Element root=document.getRootElement();
        System.out.println(root.getName());
    }
}

<?xml version="1.0" encoding="UTF-8"?>
<users>
    <user id="1" data="8888" >
        <name>黄策吾</name>
        <password>123456789</password>
        <address>城固</address>
        <sex>男</sex>
    </user>
    <user id="2">
        <name>赵敏</name>
        <password>8888</password>
        <address>光明小区</address>
        <sex>女</sex>
    </user>
</users>



import org.dom4j.Attribute;
import org.dom4j.Document;
import org.dom4j.Element;
import org.dom4j.io.SAXReader;

import java.util.List;

public class MainXML {
    public static void main(String[] args) throws Exception {
        //1、创建一个Dom4j框架提供的解析器对象
        SAXReader saxReader=new SAXReader();

        //2、使用saxReader对象把XML文件读成一个Document对象
        Document document=
                saxReader.read("E:\\code\\javese\\summerVacation\\src\\666.xml");

        //3、从文档对象中解析XML文件的全部数据。
        Element root=document.getRootElement();
        System.out.println(root.getName());
        //输出:users

        //4、获取根元素下的全部一级子元素
        List<Element> elements= root.elements();
        for (Element element : elements) {
            System.out.println(element.getName());
        }
        //输出:user
        //     user

        //5、获取当前元素下的某个子元素
        //如果有多个子元素,默认获取第一个
        Element user =root.element("user");
        System.out.println(user.elementText("name"));
        //输出:黄策吾

        //6、获取元素的属性信息
        System.out.println(user.attributeValue("id"));//1
        //或
        Attribute id=user.attribute("id");
        System.out.println(id.getName()+" "+ " "+id.getValue());//id  1
        //拿到所有属性
        List<Attribute> attributes=user.attributes();
        for (Attribute attribute : attributes) {
            System.out.println(attribute.getName()+"="+attribute.getValue());
        }
        //id=1
        //data=8888

        //7、如何获取全部的文本内容:获取当前元素下的子元素文本值
        System.out.println(user.elementText("name"));//黄策吾
        //或
        Element name=user.element("name");
        System.out.println(name.getText());//黄策吾
    }
}
相关推荐
冰帝海岸1 小时前
01-spring security认证笔记
java·笔记·spring
活宝小娜1 小时前
vue不刷新浏览器更新页面的方法
前端·javascript·vue.js
世间万物皆对象1 小时前
Spring Boot核心概念:日志管理
java·spring boot·单元测试
程序视点1 小时前
【Vue3新工具】Pinia.js:提升开发效率,更轻量、更高效的状态管理方案!
前端·javascript·vue.js·typescript·vue·ecmascript
coldriversnow1 小时前
在Vue中,vue document.onkeydown 无效
前端·javascript·vue.js
我开心就好o1 小时前
uniapp点左上角返回键, 重复来回跳转的问题 解决方案
前端·javascript·uni-app
没书读了2 小时前
ssm框架-spring-spring声明式事务
java·数据库·spring
小二·2 小时前
java基础面试题笔记(基础篇)
java·笔记·python
开心工作室_kaic2 小时前
ssm161基于web的资源共享平台的共享与开发+jsp(论文+源码)_kaic
java·开发语言·前端
刚刚好ā2 小时前
js作用域超全介绍--全局作用域、局部作用、块级作用域
前端·javascript·vue.js·vue