深入学习 XML:语法、约束、解析及相关技术

news/2025/2/22 6:04:22

一、引言

在当今的软件开发领域,数据的存储和交换至关重要。XML(Extensible Markup Language)作为一种可扩展的标记语言,以其灵活的数据表示方式和良好的跨平台性,在程序配置、数据交换等方面发挥着重要作用。本文将详细介绍 XML 的语法、约束、解析技术,以及相关的 DOM4J 和 XPath 知识。

二、XML 概述

2.1 什么是 XML

XML 全称为可扩展的标记语言,是 SGML(标准通用标记语言)的一个子集。与 HTML 不同,HTML 的元素是固定的,而 XML 的标签可以由用户自定义。W3C 在 1998 年 2 月发布了 XML 1.0 版本,虽然 2004 年 2 月发布了 1.1 版本,但由于其不能向下兼容 1.0 版本,所以目前广泛使用的仍是 1.0 版本。

2.2 W3C 组织

W3C 即万维网联盟,成立于 1994 年 10 月,以开放论坛的方式促进 Web 技术的发展。它发布的规范虽称为推荐标准,但因其权威性往往成为事实上的标准。

2.3 XML 的作用

  • 程序的配置文件:这是 XML 最常见的用途之一,通过 XML 文件可以方便地配置程序的各种参数。
  • 数据交换:不同语言的程序之间可以使用 XML 进行数据交换,因为 XML 具有良好的可读性和通用性。
  • 小型数据库:可以将 XML 用作简单的数据库来存储数据。

2.4 XML 与 HTML、properties 文件的比较

  • 与 HTML 比较:HTML 元素固定,由浏览器解析执行,主要用于表示网页;而 XML 可自定义元素,解析器通常需要自己编写,用途更为广泛。
  • 与 properties 文件比较:属性文件只能存储平面信息,解析简单;而 XML 可以存储结构化信息,但解析较为复杂。

三、XML 语法概述

3.1 XML 文档展示

<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<students>
    <student number="1001">
        <name>zhangSan</name>
        <age>23</age>    
        <sex>male</sex>
    </student>
    <student number="1002">
        <name>liSi</name>
        <age>32</age>
        <sex>female</sex>
    </student>
    <student number="1003">
        <name>wangWu</name>
        <age>55</age>
        <sex>male</sex>
    </student>
</students>

3.2 XML 文档的组成部分

  • XML 文档声明:用于说明 XML 文档的版本、编码等信息。
  • XML 处理指令:用于向 XML 处理器提供信息。
  • XML 元素:XML 文档的基本组成部分,包含开始标签、元素体和结束标签。
  • XML 特殊字符和 CDATA 区:特殊字符需要使用转义字符表示,CDATA 区用于包含大量特殊字符,提高文档可读性。
  • XML 注释:以 <!-- 开头,以 --> 结束,用于对文档进行说明。

3.3 XML 文档声明

  • 结构:包含 versionencoding 和 standalone 三个属性。
    • version:必须属性,指定 XML 文档的版本,通常为 1.0。
    • encoding:可选属性,指定文档使用的字符编码集,默认为 UTF - 8。
    • standalone:指定文档是否为独立文档,默认值为 yes
  • 注意事项:XML 文档声明必须从文档的第一行第一列开始,且大小写敏感。

3.4 XML 元素

  • 格式
    • 包含开始标签、元素体和结束标签,如 <hello>大家好</hello>;空元素需闭合,如 <hello/>
    • 元素可以包含子元素或文本数据,且必须合法嵌套。
  • 根元素:格式良好的 XML 文档必须且仅有一个根元素。
  • 元素命名规范:区分大小写,不能以数字开头,最好不以 xml 开头,不能包含空格。

3.5 元素属性

  • 属性由属性名和属性值组成,中间用等号连接,属性值必须用引号括起来。
  • 定义属性需遵循与标签名相同的命名规范,且一个元素中不能包含相同的属性名。

3.6 注释

注释以 <!-- 开头,以 --> 结束,注释中不能包含 --

3.7 转义字符和 CDATA 区

  • 转义字符:在 XML 文档中,一些特殊字符如 <> 等需要使用转义字符表示,如 &lt; 表示 <
  • CDATA 区:当大量特殊字符出现时,使用 CDATA 区可以提高文档的可读性。CDATA 区以 <![CDATA[ 开头,以 ]]> 结束,其中的特殊字符无需转义,但不能包含 ]]>

四、XML 约束(了解)

4.1 XML 约束概述

由于 XML 文档可以自定义元素,应用程序为了满足自身需求,通常要求 XML 文件的结构固定。XML 约束就是用另一个文件来约束 XML 文档的结构,常见的约束类型有 DTD 和 Schema。

4.2 DTD

  • 定义:DTD(Document Type Definition)即文档类型定义,用于约束 XML 文档。
  • 示例
<!ELEMENT students (student+)>
<!ELEMENT student (name,age,sex)>
<!ELEMENT name (#PCDATA)>
<!ELEMENT age (#PCDATA)>
<!ELEMENT sex (#PCDATA)>

解读:students 元素中可以包含 1 到多个 student 元素;student 元素必须包含 nameagesex 元素,且顺序固定;这些元素的内容为文本。

4.3 Schema

  • 概述学习 Schema 的目标一是参照其要求编写 XML 文档,二是自己定义 Schema 文档。
  • 优点:基于 XML 语法,可使用处理 XML 文档的工具处理;扩充了数据类型,支持自定义数据类型;支持元素的继承和属性组;支持命名空间,避免命名冲突。

五、XML 解析

5.1 操作 XML 文档概述

对 XML 文档的操作主要包括增删改查(CRUD),XML 解析方式分为 DOM(Document Object Model)和 SAX(Simple API for XML),这两种方式是跨语言的解析方式。

5.2 DOM4J

  • 概述:DOM4J 是专门为 Java 开发人员提供的 XML 文档解析规范,与 DOM 相似但更方便。它支持 DOM 和 SAX 模式,解析结果是 org.dom4j.Document 对象。
  • 类结构:在 DOM4J 中,所有 XML 组成部分都是一个 NodeDocument 和 Element 等可以包含子节点的节点是 Branch 的子接口。
  • 获取 Document 对象
SAXReader reader = new SAXReader();
Document doc = reader.read("src/students.xml");

  • 保存 Document 对象
doc.addDocType("students", "", "students.dtd");
OutputFormat format = new OutputFormat("\t", true);
format.setEncoding("UTF-8");
XMLWriter writer = new XMLWriter(new FileWriter(xmlName), format);
writer.write(doc);
writer.close();

  • 创建 Document 对象
Document doc = DocumentHelper.createDocument();

5.3 Document 操作

以遍历 students.xml 为例:

// 获取 Document 对象
SAXReader reader = new SAXReader();
Document doc = reader.read("src/students.xml");
// 获取根元素
Element root = doc.getRootElement();
// 获取根元素的所有子元素
List<Element> studentList = root.elements();
// 遍历每个 student 元素
for (Element student : studentList) {
    // 打印 student 元素的 number 属性
    String number = student.attributeValue("number");
    System.out.println("Number: " + number);
    // 打印 student 元素的 name 子元素内容
    String name = student.elementText("name");
    System.out.println("Name: " + name);
    // 打印 student 元素的 age 子元素内容
    String age = student.elementText("age");
    System.out.println("Age: " + age);
    // 打印 student 元素的 sex 子元素内容
    String sex = student.elementText("sex");
    System.out.println("Sex: " + sex);
}

5.4 XPath

  • 定义:XPath 是一种用于确定 XML 文档中某部分位置的语言,基于 XML 的树状结构,可用于小型查询。
  • DOM4J 对 XPath 的支持Node 接口中的三个常用方法:
    • List selectNodes(String xpathExpression):查找满足 XPath 表达式的所有子节点。
    • Node selectSingleNode(String xpathExpression):查找满足 XPath 表达式的第一个子节点。
    • String valueOf(String xpathExpression):查找满足 XPath 表达式的第一个子节点的文本内容。

http://www.niftyadmin.cn/n/5861726.html

相关文章

Vue2是如何利用Object.property实现数据的双向绑定?

我们之前说道过Object.defineProperty方法有一关键特性&#xff0c;就是数据劫持&#xff0c;通过get/set 拦截属性的读取和修改操作。Vue主要是通过数据劫持结合发布-订阅模式来实现的&#xff0c;利用Object.defineProperty来劫持各个属性的setter和getter&#xff0c;在数据…

HTTPS 证书交换流程

HTTPS 的密钥交换过程是基于 TLS&#xff08;Transport Layer Security&#xff09;协议实现的&#xff0c;其核心目标是通过加密和认证机制确保通信双方的安全性。以下是详细的 HTTPS 密钥交换过程的时序图&#xff0c;包括具体加密算法和细节。 HTTPS 密钥交换过程详细时序图…

Jenkins整合Jmeter实现接口自动化测试

&#x1f345; 点击文末小卡片&#xff0c;免费获取软件测试全套资料&#xff0c;资料在手&#xff0c;涨薪更快 一、安装jmeter 下载&#xff1a;http://jmeter.apache.org/download_jmeter.cgi 这里我用了一台Windows安装jmeter用来写接口测试的脚本&#xff0c;启动前修改j…

累加器(Accumulators)在Spark中的应用

累加器&#xff08;Accumulators&#xff09;在Spark中的应用非常广泛&#xff0c;主要用于跨节点的数据共享和统计计算。以下是关于累加器在Spark中应用的详细解释&#xff1a; 一、累加器的定义与特性 定义&#xff1a; 累加器是Spark中提供的一种分布式变量机制&#xff0…

Vmware虚拟机Ubantu安装Docker、k8s、kuboard

准备工作: 切换用户&#xff1a;su root关闭防火墙: sudo ufw diasble关闭swap: systemctl stop swap.target systemctl status swap.target systemctl disable swap.target #开机禁用 systemctl stop swap.img.swap systemctl status swap.img.swap关闭虚拟交换分区 vim /…

JMeter 中实现 100 个用户在 3 秒内并发登录

在 JMeter 中实现 100 个用户在 3 秒内并发登录,需要合理配置线程组、定时器和测试逻辑。以下是具体步骤: 1. 创建测试计划 打开 JMeter。右键点击“Test Plan”,选择 Add > Threads (Users) > Thread Group。 : 设置为 100(模拟 100 个用户)。 : 设置为 3

HTML项目一键打包工具:HTML2EXE 最新版

HTML2EXE 工具可以一键打包生成EXE可执行文件。可以打包任意HTML项目或者是一个网址为单个EXE文件&#xff0c;直接打开即可运行。支持KRPano全景VR项目、WebGL游戏项目、视频播放、,课件打包、网址打包等。 一、功能特点 类别序号功能标题1支持程序图标自定义&#xff08;支持…

一周学会Flask3 Python Web开发-客户端状态信息Cookie以及加密

锋哥原创的Flask3 Python Web开发 Flask3视频教程&#xff1a; 2025版 Flask3 Python web开发 视频教程(无废话版) 玩命更新中~_哔哩哔哩_bilibili HTTP是无状态&#xff08;stateless)协议。也就是说&#xff0c;在一次请求响应结束后&#xff0c;服务器不会留下任何关于对…