抱歉,您的浏览器无法访问本站
本页面需要浏览器支持(启用)JavaScript
了解详情 >

摘要:本文学习了XML的基本语法。

1 简介

XML(Extensible Markup Language,可扩展标记语言)是一种用于存储和传输数据的标记语言。它被设计为具有自我描述性,既可以被人阅读,也能被机器解析。

XML最大的特点有两个:

  • 自定义标签:XML没有预定义标签,允许创作者定义自己的标签和自己的文档结构。
  • 存储和传输:XML不会做任何事情,仅用于存储和传输信息。

XML与HTML的区别:

  • 核心用途:XML是标记语言,核心用途是数据存储和交换。HTML是展示语言,核心用途是网页内容展示。
  • 语法严格:XML的语法规则比较严格,HTML的语法规则相对宽松。
  • 标签规则:XML是可扩展的,用户可以自定义标签。HTML是不可扩展的,用户只能使用浏览器预定义的标签。

2 基本结构

2.1 序言

XML文档的序言是可选的,如果存在,则必须位于第一行:

xml
1
<?xml version="1.0" encoding="UTF-8"?>

属性含义:

  • version: 指定XML版本(通常为1.0)
  • encoding: 指定字符编码(通常为UTF-8)

2.2 树结构

XML文档必须有且仅有一个根元素,根元素是所有其他元素的父元素:

xml
1
2
3
<根元素名>
<!-- 其他元素 -->
</根元素名>

XML文档中的元素形成了一棵文档树,这棵树从根部开始,并扩展到树的最底端,所有的元素都可以有子元素。

所有的元素都可以有文本内容和属性(类似HTML中的树)。

2.3 元素

语法:

xml
1
2
3
<元素名>内容</元素名>
<元素名/>
<元素名></元素名>

规则:

  • 元素包括根元素及其子元素,文档的序言和声明不属于元素
  • 元素名称可以包含字母、数字、下划线和连字符,但不能包含空格,也不能以数字或标点符号开头
  • 元素必须有结束标签,除非元素是空元素,可以使用自闭合标签
  • 元素名称区分大小写
  • 元素必须正确嵌套,不能出现嵌套错误

示例:

xml
1
2
3
4
5
6
<book>
<title>XML入门指南</title>
<author>张三</author>
<price currency="CNY">45.00</price>
<description/>
</book>

2.4 属性

语法:

xml
1
<元素名 属性名="属性值">

规则:

  • 属性名称必须是合法的XML名称,并且不能重复
  • 属性值必须是合法的XML字符串,不能包含<&
  • 属性值必须用引号包围,使用单引号或双引号
  • 属性不能包含多个值

虽然XML允许使用属性,但不建议使用属性,因为属性会增加XML文档的复杂性,并且会影响XML的可读性。

建议使用元素来描述数据,仅仅使用属性来描述元素的元数据,比如ID属性。

2.5 注释

语法:

xml
1
2
3
4
5
6
<!-- 这是单行注释 -->
<!--
这是
多行
注释
-->

规则:

  • 注释不能出现在序言之前
  • 注释不能嵌套
  • 注释不能包含--

2.6 CDATA区域

CDATA区域用于包含不需要解析的文本内容。

语法:

xml
1
2
3
4
5
<![CDATA[
这里的内容不会被XML解析器处理
可以包含特殊字符:< > & ' "
常用于包含代码或HTML片段
]]>

示例:

xml
1
2
3
4
5
6
7
8
9
<code>
<![CDATA[
function compare(a, b) {
if (a < b && b > 0) {
return a + b;
}
}
]]>
</code>

2.7 实体引用

预定义实体:

  • 使用&lt;表示<小于号
  • 使用&gt;表示>大于号
  • 使用&amp;表示&和号
  • 使用&apos;表示'单引号
  • 使用&quot;表示"双引号

示例:

xml
1
<expression>a &lt; b &amp;&amp; c &gt; d</expression>

3 语法验证

3.1 格式良好

一个格式良好的XML文档必须满足:

  1. 必须有序言
  2. 必须有唯一的根元素
  3. 所有标签必须正确闭合
  4. 元素必须正确嵌套
  5. 属性值必须用引号包围
  6. 特殊字符必须转义
  7. 标签名称区分大小写

示例:

xml
1
2
3
4
5
6
7
8
9
10
11
12
13
<?xml version="1.0" encoding="UTF-8"?>
<employees>
<employee id="001">
<name>李四</name>
<department>技术部</department>
<email>lisi@example.com</email>
</employee>
<employee id="002">
<name>王五</name>
<department>销售部</department>
<email>wangwu@example.com</email>
</employee>
</employees>

3.2 有效

格式良好的文档和有效的文档有所不同,有效的文档除了满足格式良好的文档的条件外,还必须符合文档类型定义。

目前有两种不同的文档类型定义方式:

  • DTD:文档类型定义(Document Type Definition),是比较原始的验证方式,现在已经被XSD取代。
  • XSD:XML模式定义(XML Schema Definition),是基于XML的DTD代替方案。

注意:

  • 如果只是简单使用XML存储数据,可以不考虑验证问题,只要满足格式良好的文档即可。
  • 如果开发XML相关的应用程序,并且需要使用XML进行数据交换,则需要考虑验证问题,保证接收到的XML文档是有效的。

4 命名空间

当需要同时使用两个不同的文档时,如果这两个不同的文档使用了相同的元素名,并且该元素的内容和定义不一致,就会发生命名冲突。

存储了水果列表的文档:

xml
1
2
3
4
5
6
7
<?xml version="1.0" encoding="UTF-8"?>
<table>
<tr>
<td>Apples</td>
<td>Bananas</td>
</tr>
</table>

存储了桌子信息的文档:

xml
1
2
3
4
5
<?xml version="1.0" encoding="UTF-8"?>
<table>
<name>Coffee Table</name>
<width>80</width>
</table>

两个文档同时使用会产生命名冲突,命名空间提供了一种避免元素命名冲突的方法。

语法:

xml
1
xmlns:前缀="URI"

说明:

  • 使用xmlns定义命名空间
  • 使用前缀定义命名空间的名称
  • 使用URI定义命名空间的唯一标识符

可以将属性放在根元素上:

xml
1
2
3
4
5
6
7
8
9
10
11
12
13
14
<?xml version="1.0" encoding="UTF-8"?>
<root xmlns:f="http://example.com/fruit-list/"
xmlns:t="http://example.com/table-info/">
<f:table>
<f:tr>
<f:td>Apples</f:td>
<f:td>Bananas</f:td>
</f:tr>
</f:table>
<t:table>
<t:name>Coffee Table</t:name>
<t:width>80</t:width>
</t:table>
</root>

也可以将属性放在其他元素上:

xml
1
2
3
4
5
6
7
8
9
10
11
12
13
<?xml version="1.0" encoding="UTF-8"?>
<root>
<f:table xmlns:f="http://example.com/fruit-list/">
<f:tr>
<f:td>Apples</f:td>
<f:td>Bananas</f:td>
</f:tr>
</f:table>
<t:table xmlns:t="http://example.com/table-info/">
<t:name>Coffee Table</t:name>
<t:width>80</t:width>
</t:table>
</root>

将带有命名空间前缀的属性名称称为限定名,将不带命名空间前缀的属性名称称为本地名。

评论