xml
XML
基本定义
- Extensible Markup Language 可扩展标记语言
- 一种用来存储和传输的数据文本格式,不是用来展示数据
- 特点:自描述、结构化、可扩展、跨平台
- XML是W3推举的数据传输格式
[!INFO]
标记语言:数组+标签 ,用标签来描述数据的结构和含义
自描述:数据本身就带着他的结构说明,不需要额外的解释
结构化:层次清晰,天然支持树形结构
可扩展:自定义标签名,不像HTML标签是固定的
XML用户存储和传输数据,HTML用于展示数据
1 | <person> |
语法规则
- 必须有根节点
- 标签必须闭合,标签必须成对出现
- 大小写区分,标签不可交叉出现
<A>1<b>2</a></B>
1 |
|
头声明
1 | <?xml version="1.0" encoding="utf-8"? standalone="yes"?> |
- 位于文档的第一行,不能有任何前置内容(包括空格或空行),否则可能导致解析错误。
- 以
<?xml ...?>的形式出现
版本:
- XML 1.0(1998年发布,最新为第五版,2008年修订)
- 这是最常用的 XML 标准,定义了 XML 的基本语法,包括元素、属性、命名空间、CDATA 区域等。
- 简单、稳定,广泛支持,几乎所有 XML 工具和库都基于此版本。
- 对某些 Unicode 字符和控制字符的支持有限。
- 几乎所有现代 XML 应用(如 RSS、SVG、SOAP、XHTML 等)都基于 XML 1.0。
- XML 1.1(2004年发布,2006年修订)
- 允许更多的 Unicode 字符作为元素和属性名称。
- 放宽了对控制字符(如空字符)的限制。
- 由于与 XML 1.0 不完全兼容,且实际需求较少,XML 1.1 的采用率较低。
- 主要用于需要处理特殊字符集的场景,但大多数工具和系统仍优先支持 XML 1.0。
编码:
- 指定文档使用的字符编码方式,确保解析器正确解读文本字符。
- 常见的编码包括 UTF-8(默认,推荐)、UTF-16、ISO-8859-1 等
独立性:
- 指明文档是否依赖外部资源(如 DTD 或外部实体)来定义其内容。
- standalone=”yes”:表示文档是独立的,不引用外部 DTD 或实体,解析器无需加载外部资源。
- standalone=”no”:表示文档可能依赖外部 DTD 或实体,解析器需要加载这些资源。
- 如果省略,默认为 no,解析器会尝试查找外部资源。
属性
XML 元素的属性是附加在开始标签中的键值对,提供关于元素的额外信息。
1 | <element attributeName="attributeValue">内容</element> |
- 提供元数据:描述元素的特性,如 ID、类型、样式等,为标签提供额外信息,避免嵌套过多子元素
- 命名空间:通过属性(如 xmlns)声明 XML 命名空间。
1
<root xmlns="http://example.com">
- 一个标签可以有多个属性,属性的值必须使用引号
1
2
3
4
5
6
7<!-- 使用属性 -->
<person name="张三" age="30"/>
<!-- 使用子元素 -->
<person>
<name>张三</name>
<age>30</age>
</person>
为什么需要属性,子标签不是可以提供所有信息吗?
子标签(子元素)理论上可以表达所有信息,因为它们可以嵌套任意复杂的数据结构。但属性仍然有其独特价值,原因如下:
语义清晰,区分元数据与内容
- 属性适合表示与元素本身相关的元数据或控制信息,而子元素适合表示元素的内容或结构化数据。
1
2
3
4
5
6
7
8
9<!-- 使用属性 -->
<person id="123" status="active">张三</person>
<!-- 使用子元素 -->
<person>
<id>123</id>
<status>active</status>
<name>张三</name>
</person>
<!-- 属性版本更简洁,id 和 status 作为元数据更直观。 -->
- 属性适合表示与元素本身相关的元数据或控制信息,而子元素适合表示元素的内容或结构化数据。
唯一性约束
- 属性名称在一个元素内必须唯一,适合表示独一无二的特性(如 id)。子元素没有此限制,可能导致重复或复杂化。
1
2
3
4
5<element id="123" id="456"/> <!-- 非法,属性名重复 -->
<element>
<id>123</id>
<id>456</id> <!-- 合法,但语义可能不清晰 -->
</element>
- 属性名称在一个元素内必须唯一,适合表示独一无二的特性(如 id)。子元素没有此限制,可能导致重复或复杂化。
属性天然的局限性
- 只能是简单值(字符串),无法表示复杂结构(如嵌套数据)。
| 比较点 | 属性 | 子标签 |
|---|---|---|
| 用途 | 描述元素的附加信息、元数据 | 表示实际数据内容 |
| 可扩展性 | 不适合嵌套结构 | 可包含更多结构 |
| 数据类型 | 一般是字符串 | 可混合多种数据和标签 |
| 可读性 | 适合小数据、标识符 | 适合大段内容 |
| 层次结构 | 平面(键值对) | 树状(可递归嵌套) |