XML 详细介绍
XML(Extensible Markup Language,可扩展标记语言),由 W3C 制定,是一种标记语言,用于存储、传输、描述结构化数据。
核心定位:不是用来展示页面(HTML 是展示),而是用来承载数据。
一、XML 与 HTML 的区别
| 特性 | XML | HTML |
|---|---|---|
| 目的 | 描述数据、存储/传输数据 | 展示网页内容 |
| 标签 | 标签自定义,可自己造标签 | 标签是预定义固定的(<div> <p>) |
| 大小写 | 区分大小写 | 不区分 |
| 语法 | 语法严格,必须闭合、格式正确 | 语法宽松,很多标签可省略闭合 |
| 扩展性 | 可无限扩展标签 | 标签固定,不能自定义 |
示例直观对比:
<!-- XML:描述学生数据 -->
<student>
<name>张三</name>
<age>18</age>
</student>
<!-- HTML:展示内容 -->
<div>
<p>张三,18岁</p>
</div>
二、XML 基础语法规则(强制要求)
- XML 文档必须有根节点:所有元素包裹在一个根标签内,有且仅有一个根。
- 所有标签必须闭合:开始标签必须有结束标签;自闭合标签必须加
/```
3. **大小写敏感**:`<Name>` 和 `<name>` 是两个不同标签。
4. **标签必须正确嵌套**,不能交叉嵌套
✅ 正确:`<a><b></b></a>`
❌ 错误:`<a><b></a></b>`
5. **属性值必须加引号**(单引号/双引号均可)
✅ `<person id="1001"/>`
❌ `<person id=1001/>`
6. **特殊字符必须转义**| 原字符 | 转义实体 | 含义 |
| --- | --- | --- |
| & | `&` | 和 |
| < | `<` | 小于 |
| > | `>` | 大于 |
| " | `"` | 双引号 |
| ' | `'` | 单引号 |
>
> 如果文本里大量特殊符号,可以使用 **CDATA** 块,内部内容不解析:
<name>张三</name> <!-- 成对闭合 -->
<img /> <!-- 自闭合,不能写成 <img> -->
3. **大小写敏感**:`<Name>` 和 `<name>` 是两个不同标签。
4. **标签必须正确嵌套**,不能交叉嵌套
✅ 正确:`<a><b></b></a>`
❌ 错误:`<a><b></a></b>`
5. **属性值必须加引号**(单引号/双引号均可)
✅ `<person id="1001"/>`
❌ `<person id=1001/>`
6. **特殊字符必须转义**| 原字符 | 转义实体 | 含义 |
| --- | --- | --- |
| & | `&` | 和 |
| < | `<` | 小于 |
| > | `>` | 大于 |
| " | `"` | 双引号 |
| ' | `'` | 单引号 |
>
> 如果文本里大量特殊符号,可以使用 **CDATA** 块,内部内容不解析:
## 三、XML 文档结构
完整 XML 文件一般由:**声明 + 根元素 + 子元素 + 属性 + 文本**组成。
<content><![CDATA[1<2 && 3>1]]></content>
## 三、XML 文档结构
完整 XML 文件一般由:**声明 + 根元素 + 子元素 + 属性 + 文本**组成。
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<!-- 上面这行:XML声明,可选,建议写在第一行,不能有前置空格 -->
<!-- version:版本,只有1.0和1.1,最常用1.0 -->
<!-- encoding:编码,中文一般UTF-8 / GB2312 -->
<!-- standalone:yes/no,是否依赖外部DTD -->
### 元素、属性概念
- **元素(Element)**:`<book></book>` 整体叫元素;`<title>` 是子元素
- **属性(Attribute)**:写在开始标签内,用来描述元素信息,`id="b001"`>
> 设计取舍:
>
>
> - 简短元信息适合放**属性**
> - 长文本、多段内容适合作为**子元素**
## 四、XML 文档校验:DTD / XSD
XML 默认只是语法正确(格式良好 well-formed);
如果要**约束文档结构(规定必须有哪些标签、类型、顺序)**,就要用 DTD 或 XSD。
### 1. DTD(Document Type Definition,文档类型定义)
比较老,语法简单,**不支持数据类型**,只能约束结构。
<books> <!-- 根节点 -->
<book id="b001"> <!-- book元素,id是属性 -->
<title>XML入门</title> <!-- 子元素,文本内容:XML入门 -->
<author>李四</author>
<price>59.00</price>
</book>
</books>
### 元素、属性概念
- **元素(Element)**:`<book></book>` 整体叫元素;`<title>` 是子元素
- **属性(Attribute)**:写在开始标签内,用来描述元素信息,`id="b001"`>
> 设计取舍:
>
>
> - 简短元信息适合放**属性**
> - 长文本、多段内容适合作为**子元素**
## 四、XML 文档校验:DTD / XSD
XML 默认只是语法正确(格式良好 well-formed);
如果要**约束文档结构(规定必须有哪些标签、类型、顺序)**,就要用 DTD 或 XSD。
### 1. DTD(Document Type Definition,文档类型定义)
比较老,语法简单,**不支持数据类型**,只能约束结构。
<!-- 内部DTD示例 -->
### 2. XSD / XML Schema(推荐替代DTD)
W3C标准,**支持丰富数据类型(数字、日期、字符串)**,支持命名空间,企业项目最常用。后缀 `.xsd`
可以定义:标签顺序、字段类型、长度、必填/可选。
>
> 两个概念区分:
>
>
> - **Well-Formed(格式良好)**:语法满足XML基础规则,标签闭合嵌套正确
> - **Valid(有效)**:格式良好,同时符合DTD/XSD约束
## 五、命名空间 Namespace(xmlns)
XML 允许自定义标签,当合并多份XML时,标签名冲突(都有`<table>`,一个是表格、一个是桌子),用命名空间区分。
<!ELEMENT books (book+)>
<!ELEMENT book (title,author)>
<!ELEMENT title (#PCDATA)>
<!ELEMENT author (#PCDATA)>
<!ATTLIST book id CDATA #REQUIRED>
]>
### 2. XSD / XML Schema(推荐替代DTD)
W3C标准,**支持丰富数据类型(数字、日期、字符串)**,支持命名空间,企业项目最常用。后缀 `.xsd`
可以定义:标签顺序、字段类型、长度、必填/可选。
>
> 两个概念区分:
>
>
> - **Well-Formed(格式良好)**:语法满足XML基础规则,标签闭合嵌套正确
> - **Valid(有效)**:格式良好,同时符合DTD/XSD约束
## 五、命名空间 Namespace(xmlns)
XML 允许自定义标签,当合并多份XML时,标签名冲突(都有`<table>`,一个是表格、一个是桌子),用命名空间区分。
网页表格
<root xmlns:html="http://www.w3.org/1999/xhtml"
xmlns:my="http://demo.com/xml">
<my:table>木桌子</my:table>
</root>
```
xmlns:前缀="URI":声明命名空间- URI只是唯一标识,不一定是可访问网址
六、XML 常用解析方式(程序读取XML)
- DOM(Document Object Model)
一次性把整个XML加载到内存,构建树形对象;支持增删改查。适合小文件,大文件耗内存。
- SAX(Simple API for XML)
事件驱动,边读边解析,不加载全部文档;只读,不能修改,适合超大XML。
- StAX:流式解析,介于DOM和SAX之间,Java常用。
- JDOM / DOM4J:Java封装库,简化DOM操作。
七、XML 的优缺点
✅ 优点
- 纯文本格式,跨平台、跨语言,可读性好
- 自描述,标签语义清晰
- 支持校验(XSD/DTD),数据结构规范
- 支持命名空间,可组合多个文档
❌ 缺点
- 冗余大,标签多,传输体积大(对比JSON)
- 解析相对复杂,代码量比JSON多
- 移动端、前后端接口现在大多被JSON替代
八、XML 典型应用场景
- 早期Web接口 WebService(SOAP):基于XML;现在RESTful JSON为主
- 配置文件:Maven pom.xml、Spring、MyBatis、Android 旧版布局文件
- Office文档底层:docx、xlsx本质是压缩包,内部由一堆XML组成(OOXML)
- RSS订阅、SVG矢量图(SVG本身就是XML)
- 数据交换:异构系统之间(银行、政务系统很多保留XML报文)
九、XML vs JSON 简单对比
| 项目 | XML | JSON |
|---|---|---|
| 可读性 | 良好,标签多 | 简洁,更轻量 |
| 数据体积 | 大,冗余 | 小 |
| 解析难度 | 复杂 | 简单 |
| 数据类型 | XSD支持类型,原生文本 | 原生支持数字、布尔、null |
| 使用场景 | 配置、SOAP、传统政务/金融 | 前后端接口、现代应用 |
十、常用工具
- 在线:XML格式化、校验、转JSON工具
- 编辑器:VS Code(XML插件)、Notepad++
- 命令行:xmllint(Linux,校验XML、XSD)
如果你需要,我可以继续:
- 写一份可直接运行的完整XML+XSD示例
- Python / Java 解析XML代码示例
- XML 转 JSON 原理和代码
你想要哪一部分?