当前位置: 首页 > article >正文

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

一、引言

在当今的软件开发领域,数据的存储和交换至关重要。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.kler.cn/a/557914.html

相关文章:

  • Git 中 rebase, squash, amend 的作⽤
  • 【回溯算法2】
  • 酵母细胞壁市场报告:探索潜力无限的生物资源宝库
  • javaEE-14.spring MVC练习
  • Python 高级数据结构操作全解析:从理论到实践
  • 智能硬件-01智能停车场
  • 案例-14.文件上传-简介
  • 大模型提示词工程实战
  • MySql面试宝典【刷题系列】
  • 审计级别未启用扩展模式导致查询 DBA_AUDIT_TRAIL 时 SQL_TEXT 列为空
  • C++ 设计模式-状态模式
  • 【Python爬虫(41)】消息队列:分布式爬虫的“智慧中枢”
  • 将产品照片(form.productPhotos)转为 JSON 字符串发送给后端
  • 学习笔记-沁恒第五讲-米醋
  • 如何在 Ubuntu 上安装和使用 Podman ?
  • Zookeeper应用案例-分布式锁-实现思路
  • My second Android application
  • CellChat前沿:spaCI:通过自适应图模型破译空间蜂窝通信
  • 位运算实用技巧与LeetCode实战
  • Linux系统使用Docker部署Geoserver并做数据挂载进行地图服务的发布和游览