XML 语法笔记

XML 光速入门!教程来自 W3school

什么是 XML?

  • 可扩展标记语言(EXtensible Markup Language)
  • 用于数据传输
  • 自行定义标签
  • 方便程序读取
  • 组成成分:元素、属性和文本
  • RFC 4825

TL;DR

下面这张图是网站“Linux中国”的 RSS 片段,很有代表性,我把各个字段的含义都标出来了,基本上包括了 XML 的所有语法。

一张图看懂 XML!

元素

元素(Element)是指从开始标签到结束标签的部分,包括标签本身和标签包括的内容。

一个元素里面可以有:

  • 属性
  • 子元素
  • 文本

子元素还能继续包含其他元素,所以是一个树形结构。

注意:XML 没有预定义的标签,这和 HTML 不同,HTML 中的 <p><h1> 标签都是预定义的。XML 所有的标签和属性都是创作者自定义的。

例子

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
<bookstore>
<book category="COOKING">
<title lang="en">Everyday Italian</title>
<author>Giada De Laurentiis</author>
<year>2005</year>
<price>30.00</price>
</book>
<book category="CHILDREN">
<title lang="en">Harry Potter</title>
<author>J K. Rowling</author>
<year>2005</year>
<price>29.99</price>
</book>
<book category="WEB">
<title lang="en">Learning XML</title>
<author>Erik T. Ray</author>
<year>2003</year>
<price>39.95</price>
</book>
</bookstore>
XML 的树形结构 | W3school

语法规则

  1. 所有的元素必须关闭标签

  2. 对大小写敏感

  3. 标签必须正确的嵌套

  4. 文档必须有根元素

  5. 特殊意义的字符使用实体引用(Entity References)

    实体引用以 & 开头,以 ; 结尾,比如 < 字符用 &lt; 替换。

  6. 注释:<!-- 注释内容 -->

  7. XML 中空格会被保留,而 HTML 会把多个空格合并成一个

属性

属性(Attribute)提供关于元素的额外(附加)信息。

  • 附加的存在
  • 属性值双引号
  • 难以维护

属性通常提供不属于数据组成部分的信息,但这些信息对于处理这个元素的软件来说很重要。

1
<file type="gif">computer.gif</file>

包含双引号的属性值用单引号包围:

1
<gangster name='George "Shotgun" Ziegler'>

或者可以使用实体引用:

1
<gangster name="George &quot;Shotgun&quot; Ziegler">

元素还是属性?

1
2
3
4
5
6
7
8
9
10
<person sex="female">
<firstname>Anna</firstname>
<lastname>Smith</lastname>
</person>

<person>
<sex>female</sex>
<firstname>Anna</firstname>
<lastname>Smith</lastname>
</person>

这两个例子传递的信息都是相同的,只是 sex 一个是作为属性存在,一个是作为字段存在。什么时候用属性,什么时候用字段是没有规定的。教程里面建议,如果信息看起来很像数据,就使用子元素。

元数据(有关数据的数据)应当存储为属性,而数据本身应当存储为元素。

命名空间

命名空间可以避免元素名冲突。

使用前缀可以避命名冲突。前缀是在标签名的前面加上前缀名称,用冒号隔开:

1
2
3
4
5
6
<h:table>
<h:tr>
<h:td>Apples</h:td>
<h:td>Bananas</h:td>
</h:tr>
</h:table>

而命名空间对标签进行限定,声明某个前缀属于一个特定的命名空间,采用的方法是添加一个 xmlns 属性:

1
xmlns:namespace-prefix="namespaceURI"
1
2
3
4
5
6
<h:table xmlns:h="http://www.w3.org/TR/html4/">
<h:tr>
<h:td>Apples</h:td>
<h:td>Bananas</h:td>
</h:tr>
</h:table>

命名空间地址的作用是唯一性,不会被解析,通常是对应的开发者的网站。

用于标示命名空间的地址不会被解析器用于查找信息。其惟一的作用是赋予命名空间一个惟一的名称。不过,很多公司常常会作为指针来使用命名空间指向实际存在的网页,这个网页包含关于命名空间的信息。

如果省略了前缀名字,则表示所有子元素都属于这个命名空间。

1
xmlns="namespaceURI"
1
2
3
4
5
6
<table xmlns="http://www.w3.org/TR/html4/">
<tr>
<td>Apples</td>
<td>Bananas</td>
</tr>
</table>

CDATA

XML 解析器不会解析 CDATA 部分内的文本,常用来保存大段原始数据。

CDATA 部分以 <![CDATA[ 开始,以 ]]> 结束:

1
<![CDATA[不会被解析的内容]]>

CDATA 部分不能包含字符串 ]]>。也不允许嵌套的 CDATA 部分。

标记 CDATA 部分结尾的 ]]> 不能包含空格或折行。

XML 相关技术

名称 描述
XML HttpRequest 用于在网页服务器之间传递数据,比如 AJAX
XML Parser 解析器,用来将 XML 文本解析成 DOM 对象
XML DOM 定义了操作 XML 文档的规范,把 XML 展示为树形结构
XML XPath XPath 表达式使用类似文件路径的语句来选取 XML 中的节点
XML CSS 用 CSS 样式表来格式化 XML 文档
XML XSLT 同样是用来格式化 XML 的,比 CSS 复杂,功能更多
XML XQuery XML 的查询语言,如同 SQL 之于数据库
XML XLink XML 里的超链接
XML DTD 规范化,用来定义 XML 文档元素和属性的结构
XML Schema 描述 XML 文档结构,自己也是 XML 语法,功能和 DTD 一样

参考资料: