Skip to content

XML


XML(Extensible Markup Language)是一种标记语言,用于描述数据结构和内容。类似功能的标记语言还有yaml json init toml 等等。

和 HTML 的关系

XML 和 HTML 都是基于 SGML(标准通用标记语言),它们都是标签描述数据。但是 XML 的语法更加严格,更加规范。XML 必须有根标签,标签必须要闭合,属性必须有值,标签名可以自定义。

一句话总结就是: XML 是 命名自由但规范严格,HTML 是命名严格但规范自由。

提示

解析时 HTML 出现错误时会尽可能的渲染正确部分而忽略错误,而 XML 出现错误时会直接报错并停止解析。

在 H5 中已经兼容了 XML 数据,例如 SVG 标签就是 XML 数据。

基本语法

根标签

XML 必须有根标签,顶层必须是一个对象结构(键值对)。

xml
<?xml version="1.0" encoding="UTF-8"?>
<root>
  <child>
    <grandchild>
      <text>Hello, World!</text>
    </grandchild>
  </child>
</root>

一般标签

一般标签用于描述数据结构和内容。一般标签可以有属性,可以有子标签,可以有文本内容。标签名,属性名均可以自定义。

xml
<tag>content</tag>
<tag id="id" >content</tag>
<tag id="id" >
  content
  <tag>content</tag>
</tag>

注释和 CDATA 节点

注释和 HTML 相同,使用 <!-- comment --> 表示。

xml
<!-- comment -->

CDATA 节点标识内容为纯文本,不会被解析。

xml
<![CDATA[ <tag>content</tag> ]]>

<tag>content</tag> 会被解析为纯文本。

XML 的数据提取

以转换成 JSON 为例,XML 的数据提取后的结构如下:

XML:

xml
<library>
  书本列表:
  <book id="1" type="program">
    <name>Java编程思想</name>
    <price>99.0</price>
    <empty/>
  </book>
  <book id="2">
    <name>Python实战</name>
    <price>89.5</price>
  </book>
</library>

JSON:

json
{
  "library": {
    "#text": "书本列表:", // 文本节点映射为#text
    "book": [  // 重复节点转为数组
      {
        "@id": "1",        // 属性前缀@
        "@type": "program",
        "name": "Java编程思想",
        "price": "99.0",
        "empty": null      // 空节点映射为null
      },
      {
        "@id": "2",
        "name": "Python实战",
        "price": "89.5"
      }
    ]
  }
}

说明

文本节点映射为 #text,属性前缀用 @ ,目的是和子标签区分避免出现重复属性。