xml
song

XML

基本定义

  • Extensible Markup Language 可扩展标记语言
  • 一种用来存储和传输的数据文本格式,不是用来展示数据
  • 特点:自描述结构化可扩展跨平台
  • XML是W3推举的数据传输格式

[!INFO]
标记语言:数组+标签 ,用标签来描述数据的结构和含义
自描述:数据本身就带着他的结构说明,不需要额外的解释
结构化:层次清晰,天然支持树形结构
可扩展:自定义标签名,不像HTML标签是固定的
XML用户存储和传输数据,HTML用于展示数据

1
2
3
4
5
<person>
<name>张三</name>
<age>18</age>
<city>上海</city>
</person>

语法规则

  • 必须有根节点
  • 标签必须闭合,标签必须成对出现
  • 大小写区分,标签不可交叉出现 <A>1<b>2</a></B>
1
2
3
4
5
<?xml version="1.0" encoding="utf-8"?>
<root>
<id>111</id>
<!--<A>1<b>2</a></B>-->
</root>

头声明

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. 语义清晰,区分元数据与内容

    • 属性适合表示与元素本身相关的元数据或控制信息,而子元素适合表示元素的内容或结构化数据。
      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 作为元数据更直观。 -->
  2. 唯一性约束

    • 属性名称在一个元素内必须唯一,适合表示独一无二的特性(如 id)。子元素没有此限制,可能导致重复或复杂化。
      1
      2
      3
      4
      5
      <element id="123" id="456"/> <!-- 非法,属性名重复 -->
      <element>
      <id>123</id>
      <id>456</id> <!-- 合法,但语义可能不清晰 -->
      </element>
  3. 属性天然的局限性

    • 只能是简单值(字符串),无法表示复杂结构(如嵌套数据)。
比较点 属性 子标签
用途 描述元素的附加信息、元数据 表示实际数据内容
可扩展性 不适合嵌套结构 可包含更多结构
数据类型 一般是字符串 可混合多种数据和标签
可读性 适合小数据、标识符 适合大段内容
层次结构 平面(键值对) 树状(可递归嵌套)

转义

XML约束

DTD约束

Schema约束

XML解析

DOM

SAX解析

Xpath

由 Hexo 驱动 & 主题 Keep