1、引言
XML(可扩展标记语言)是一种用于存储和传输数据的标记语言,它被设计为具有自我描述性且易于理解。本文将全面介绍XML的语法规则,包括元素、属性、命名规则、转义字符等核心概念。
2、XML文档基本结构
一个完整的XML文档由以下几个部分组成:
- XML声明(可选):定义XML版本和字符编码
- 文档类型定义(DTD,可选):定义文档结构
- 元素:文档的主要内容
- 注释(可选):对文档进行说明
xml
<?xml version="1.0" encoding="UTF-8"?>
<!-- 这是一个XML示例文档 -->
<bookstore>
<book category="fiction">
<title lang="en">Harry Potter</title>
<author>J.K. Rowling</author>
<year>2005</year>
<price>29.99</price>
</book>
</bookstore>
3、XML元素详解
3.1、 元素基本结构
XML元素是XML文档的基本构建块,由开始标签、内容和结束标签组成:
xml
<元素名>内容</元素名>
- 开始标签:<元素名>
- 结束标签:</元素名>
- 内容:可以是文本、其他元素或两者的组合
- 没有内容的元素可以简写为:
xml
<元素名/>
等价于:
xml
<元素名></元素名>
3.2、元素嵌套
XML元素可以嵌套其他元素,但必须正确嵌套:
xml
<parent>
<child>
<subchild>...</subchild>
</child>
</parent>
不允许交叉嵌套:
xml
<parent>
<child>
</parent>
</child>
3.3、元素命名规则
- 名称可以包含字母、数字和其他字符 (、<book_title>、、<_book>,以上是正确的示例)
- 名称不能以数字或标点符号开头(<1book>, 错误示例)
- 名称不能以"xml"(或XML、Xml等)开头(, 错误示例)
- 称不能包含空格(, 错误示例)
- 名称区分大小写(XML的名称是区分大小写的,因此开始标签和结束标签的大小写要严格匹配才行)
4、XML属性详解
属性提供有关元素的额外信息,总是位于元素的开始标签中,语法如下:
xml
<元素名 属性名="属性值">内容</元素名>
属性的规则如下:
- 属性值必须用引号引起来(单引号或双引号)
- 一个元素可以有多个属性
- 属性不能重复
- 属性不能包含嵌套结构
属性示例如下:
xml
<book category="fiction" lang="en">
<title>Harry Potter</title>
</book>
那么问题来了,什么时候使用元素,什么时候使用属性呢?
- 如果信息看起来像是数据的一部分,使用子元素
- 如果信息看起来像是关于数据的元数据,使用属性
5、XML命名空间
命名空间用于避免元素名称冲突,特别是在合并多个XML文档时,命名空间语法如下:
xml
<前缀:元素名 xmlns:前缀="命名空间URI">
命名空间示例如下:
xml
<root xmlns:h="http://www.w3.org/TR/html4/"
xmlns:f="http://www.w3schools.com/furniture">
<h:table>
<h:tr>
<h:td>Apples</h:td>
<h:td>Bananas</h:td>
</h:tr>
</h:table>
<f:table>
<f:name>Coffee Table</f:name>
<f:width>80</f:width>
</f:table>
</root>
可以定义默认命名空间,这样就不需要为每个元素添加前缀:
xml
<table xmlns="http://www.w3.org/TR/html4/">
<tr>
<td>Apples</td>
<td>Bananas</td>
</tr>
</table>
6、XML特殊字符处理
XML中有一些字符具有特殊含义,如果要在内容中使用这些字符,必须使用转义字符或CDATA节。
- XML中预定义字符表
字符 | 实体引用 |
---|---|
< | < |
> | > |
& | & |
' | ' |
" | " |
示例如下:
xml
<expression>a < b</expression>
- CDATA节
对于包含大量特殊字符的文本,可以使用CDATA节:
xml
<![CDATA[
这里可以包含任意字符,包括 < > & ' "
不会被XML解析器解析
]]>
示例如下:
xml
<script>
<![CDATA[
function compare(a, b) {
if (a < b) return -1;
if (a > b) return 1;
return 0;
}
]]>
</script>
7、XML注释
XML注释与HTML注释类似:
xml
<!-- 这是一个注释 -->
注释规则如下:
- 注释不能出现在XML声明之前
- 注释不能出现在标签内部
- 注释不能嵌套
- 字符串"--"不能出现在注释中
有效示例:
xml
<?xml version="1.0"?>
<!-- 这是有效的注释 -->
<root>
<!-- 另一个有效注释 -->
</root>
无效示例如下:
xml
<!-- 第一个注释 <!-- 嵌套注释 --> -->
<root <!-- 标签内注释 --> >
8、XML中的DTD
XML文件中的DTD(Document Type Definition,文档类型定义) 正是用来定义该XML文件的结构和约束规则的。它规定了XML文档中允许出现哪些元素、元素的嵌套关系、属性以及它们的类型等。DTD可以确保XML文档符合预定义的结构,便于数据交换和验证。
8.1、DTD的作用
- 定义元素结构:规定XML中可以包含哪些元素,以及元素的嵌套关系。
- 定义属性:规定元素的属性及其类型(如文本、枚举、ID等)。
- 定义实体:可以声明实体(类似于变量),用于复用文本或特殊字符。
- 验证XML文档:确保XML文档符合DTD定义的规则,防止数据格式错误。
8.2、 内部DTD
DTD直接嵌入在XML文件中,适用于小型或独立的XML文档。
语法:
xml
<!DOCTYPE 根元素名 [
<!-- DTD规则定义 -->
]>
示例如下:
xml
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE bookstore [
<!ELEMENT bookstore (book+)> <!-- bookstore必须包含至少一个book -->
<!ELEMENT book (title, author, year, price)> <!-- book必须按顺序包含这些子元素 -->
<!ELEMENT title (#PCDATA)> <!-- title只能包含文本 -->
<!ELEMENT author (#PCDATA)>
<!ELEMENT year (#PCDATA)>
<!ELEMENT price (#PCDATA)>
<!ATTLIST book category CDATA #REQUIRED> <!-- book必须有一个category属性 -->
]>
<bookstore>
<book category="fiction">
<title>Harry Potter</title>
<author>J.K. Rowling</author>
<year>2005</year>
<price>29.99</price>
</book>
</bookstore>
8.3、 外部DTD
DTD存储在单独的文件中(如 bookstore.dtd),适用于大型项目或多文件共享相同结构。
语法:
xml
<!DOCTYPE 根元素名 SYSTEM "DTD文件路径">
示例:
xml
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE bookstore SYSTEM "bookstore.dtd">
<bookstore>
<book category="fiction">
<title>Harry Potter</title>
<author>J.K. Rowling</author>
<year>2005</year>
<price>29.99</price>
</book>
</bookstore>
bookstore.dtd 文件内容:
xml
<!ELEMENT bookstore (book+)>
<!ELEMENT book (title, author, year, price)>
<!ELEMENT title (#PCDATA)>
<!ELEMENT author (#PCDATA)>
<!ELEMENT year (#PCDATA)>
<!ELEMENT price (#PCDATA)>
<!ATTLIST book category CDATA #REQUIRED>
8.4 、DTD 常见语法规则
8.4.1、定义元素:
xml
<!ELEMENT 元素名 (子元素|内容类型)>
- (#PCDATA):表示纯文本(不能包含子元素)。
- EMPTY:表示空元素(如 )。
- ANY:表示可以包含任何内容(不推荐使用,会降低约束性)。
- (A, B, C):表示必须按顺序包含A、B、C。
- (A | B):表示只能包含A或B之一。
- ?:表示可选(0或1次)。
- *:表示0次或多次。
- +:表示1次或多次
8.4.2、定义属性:
xml
<!ATTLIST 元素名 属性名 属性类型 默认值>
属性类型如下:
- CDATA:普通文本
- ID:唯一标识符(不能重复)
- IDREF:引用另一个元素的ID
- (A|B|C):枚举值(只能是A、B或C)
- NMTOKEN:合法的XML名称(不含空格)
默认值: - #REQUIRED:必须提供该属性
- #IMPLIED:可选属性
- #FIXED "值":固定值(如果提供,必须匹配)
- "默认值":如果未提供,则使用默认值
示例:
xml
<!ATTLIST book
id ID #REQUIRED
category (fiction|non-fiction) "fiction"
lang CDATA #IMPLIED
>
9、总结
XML(eXtensible Markup Language,可扩展标记语言)是一种用于存储和传输结构化数据的标记语言,它被设计为人类可读和机器可解,广泛应用于配置文件、文档存储(如Office Open XML)和数据交换(如RSS、SVG)等领域,掌握XML有助于帮助程序员理解"协议"的概念,如果在以后的工作中有用到XML,可以快速的上手开发。