XML学习

XML 概述

XML(Extensible Markup Language)是一种可扩展标记语言,是 SGML 的子集。与 HTML 不同,XML 标签可以由用户自定义,具有极高的灵活性。W3C 于 1998 年发布 XML 1.0 版本,2004 年发布 1.1 版本,但因不向下兼容而未被广泛使用,目前主流仍为 1.0 版本。

XML 的主要作用包括作为程序的配置文件、不同语言之间的数据交换媒介以及作为小型数据库存储数据。与 HTML 相比,XML 的标签是自定义的,需要自定义解析器进行解析,主要用于数据存储、配置和交换。


XML 语法基础

XML 文档声明必须位于第一行第一列,格式如下:

XML 复制代码
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
  • version:必须指定,当前主流为 1.0。
  • encoding:可选,默认为 UTF-8。
  • standalone:可选,表示是否依赖外部约束文件。

XML 元素必须有且仅有一个根元素,元素命名区分大小写,不能以数字或 xml 开头,不能包含空格。空元素可以简写为 <hello/>

属性必须用引号(单引号或双引号)包裹,同一元素中不能有重复属性名。注释格式为 <!-- 这是注释 -->

特殊字符需要使用转义字符,例如 < 转义为 &lt;> 转义为 &gt;。大量特殊字符可以使用 CDATA 区:

XML 复制代码
<![CDATA[ <a> 这里不需要转义 </a> ]]>

XML 约束:DTD 与 Schema

DTD(Document Type Definition)是一种平面式文档,扩展名为 .dtd,用于约束元素、顺序和数量。例如:

dtd 复制代码
<!ELEMENT students (student+)>
<!ELEMENT student (name,age,sex)>
<!ELEMENT name (#PCDATA)>

Schema(.xsd)本身是 XML 文档,支持数据类型、命名空间和继承等功能,推荐使用 Schema,因其功能更强大且语法统一。


XML 解析技术

DOM 和 SAX 是两种常见的 XML 解析方式。DOM 将 XML 加载为树结构,适合增删改查,但大文件性能较差;SAX 采用事件驱动方式,内存占用小,但只能读取。

DOM4J 是专为 Java 开发者设计的 XML 解析规范,比 DOM 更简洁。常用操作包括读取 XML、获取根元素、遍历子元素以及保存 XML。例如:

java 复制代码
SAXReader reader = new SAXReader();
Document doc = reader.read("students.xml");
Element root = doc.getRootElement();
List<Element> students = root.elements();

for (Element stu : students) {
    String number = stu.attributeValue("number");
    String name = stu.elementText("name");
    System.out.println(number + " : " + name);
}

保存 XML 的示例:

java 复制代码
OutputFormat format = new OutputFormat("\t", true);
format.setEncoding("UTF-8");
XMLWriter writer = new XMLWriter(new FileWriter("out.xml"), format);
writer.write(doc);
writer.close();

XPath:快速定位 XML 节点

XPath 是一种 XML 查询语言,DOM4J 对其提供了良好支持。常用操作包括:

java 复制代码
List<Node> nodes = document.selectNodes("//student[@number='1001']");
Node node = document.selectSingleNode("/students/student[1]");
String value = document.valueOf("//student/name");

常用 XPath 表达式示例:

表达式 含义
/persons/person 根路径下所有 person
//age 任意位置的 age
//person[1] 第一个 person
//@id 所有 id 属性
//person[@id='p1'] idp1person
相关推荐
朱容zr3331337 小时前
为什么推荐使用自增主键?使用UUID作为主键的优缺点是什么?
java·运维·数据库·后端·mysql·面试·性能优化
云水一下7 小时前
零基础玩转bWAPP靶场(三十一):XML/XPath 注入(搜索)
xml·web安全·bwapp
艾莉丝努力练剑7 小时前
【Linux:动静态库】Linux 动静态库与可执行文件
linux·运维·服务器·学习·面试·文件系统·动静态库
知彼解己7 小时前
Eclipse Temurin:企业级 Java JDK 发行版的最佳实践
java·ide·eclipse
朱容zr3331337 小时前
请解释“回表”的概念。
java·前端·数据库
不吃辣4907 小时前
vibe coding | 如何做一个 AI 音乐生成工具?
java·人工智能·后端·ai·ai编程
软件技术NINI7 小时前
盗墓笔记html+css+js 2页
css·笔记·html
NWU_LK7 小时前
【WebFlux】第八篇 —— 自定义调度器
java
AI人工智能+电脑小能手8 小时前
【大白话说Java面试题 第210题】【10_网络协议篇】第1题:说说 TCP/IP 网络五层模型
java·网络协议·tcp/ip·计算机网络·网络五层模型
wuminyu8 小时前
JUC组件逐层剥离与深度剖析
java·linux·c语言·jvm·c++·算法