全面详解XML语言基础与进阶知识,掌握这一重要的标记语言,提升数据处理与交换能力
XML(eXtensible Markup Language,可扩展标记语言)是一种用于存储和传输数据的标记语言。它是由万维网联盟(W3C)在1998年推出的,设计目标是简化SGML(Standard Generalized Markup Language)的复杂性,同时保留其灵活性和强大功能。
XML是一种元标记语言,它定义了一套规则,用于以人类可读和机器可解析的格式对文档进行编码。XML的主要特点包括:
XML的诞生有其特定的历史背景:
随着时间的推移,许多相关技术也发展起来,包括XML Schema、XSLT、XPath和XQuery等,这些技术共同构成了XML技术栈。
尽管近年来JSON等更简洁的数据格式变得流行,XML仍然在许多领域保持重要地位:
<?xml version="1.0" encoding="UTF-8"?>
<bookstore>
<book category="科幻">
<title>三体</title>
<author>刘慈欣</author>
<year>2008</year>
<price>38.00</price>
</book>
<book category="小说">
<title>活着</title>
<author>余华</author>
<year>1993</year>
<price>35.00</price>
</book>
</bookstore>
注意:XML看起来很像HTML,但它们的用途不同。HTML用于显示数据,而XML用于描述和传输数据。XML没有预定义的标签,标签的含义由文档创建者定义。
要正确使用XML,必须理解其基本语法规则。XML有一套严格的语法,不遵循这些规则的文档将被视为无效。
XML文档通常以XML声明开始,指定XML版本和字符编码:
<?xml version="1.0" encoding="UTF-8"?>
这行声明是可选的,但建议始终包含它。它必须位于文档的第一行,前面不能有任何内容(包括空格)。
XML文档由元素组成,每个元素由开始标签、内容和结束标签组成:
<title>三体</title>
元素命名规则:
XML元素可以包含属性,提供有关元素的额外信息:
<book category="科幻">
属性值必须始终使用引号(单引号或双引号)括起来。与元素类似,属性名也必须遵循命名规则。
XML元素可以嵌套,创建层次结构:
<book>
<title>三体</title>
<author>刘慈欣</author>
</book>
正确的嵌套非常重要。以下是错误的嵌套:
<book><title>三体</book></title> <!-- 错误 -->
没有内容的元素称为空元素,可以使用两种方式表示:
<image src="cover.jpg"></image>
<image src="cover.jpg" /> <!-- 简写形式 -->
XML注释使用以下语法:
<!-- 这是一个XML注释 -->
注释不能包含两个连续的连字符(--),也不能以连字符结尾。
某些字符在XML中有特殊含义(如<和>)。要在文本中使用这些字符,必须使用字符实体:
字符 | 实体 |
---|---|
< | < |
> | > |
& | & |
' | ' |
" | " |
<message>在XML中,<book>标签表示一本书。</message>
显示为:"在XML中,<book>标签表示一本书。"
当需要包含大量特殊字符而不想使用实体时,可以使用CDATA部分:
<script>
<![CDATA[
if (x < y && y > z) {
// 代码逻辑
}
]]>
</script>
CDATA部分中的文本不会被XML解析器解析,所有字符都被视为普通字符。
警告:不遵循XML语法规则的文档将被视为无效XML。大多数XML解析器会拒绝处理无效的XML文档,因此严格遵循语法规则非常重要。
XML文档必须具有良好的结构,即遵循特定的组织形式和规则。良好结构的XML文档更易于处理和理解。
每个XML文档必须有且仅有一个根元素,所有其他元素都嵌套在其中。根元素也被称为文档元素。
<?xml version="1.0" encoding="UTF-8"?>
<bookstore> <!-- 根元素 -->
<book>...</book>
<book>...</book>
</bookstore>
XML文档形成树状结构,元素之间存在父子关系:
<library>
<section name="科技">
<book id="1">
<title>人工智能导论</title>
<author>
<first-name>张</first-name>
<last-name>三</last-name>
</author>
</book>
</section>
</library>
在设计XML文档时,经常需要决定信息应该作为元素还是属性。两种方式各有优缺点:
使用元素 | 使用属性 |
---|---|
适合存储数据 | 适合存储元数据(关于数据的数据) |
可以包含多个值 | 只能有一个值 |
可以嵌套 | 不能嵌套 |
容易扩展 | 扩展性有限 |
使用元素表示信息:
<book>
<id>1</id>
<title>XML基础</title>
<language>中文</language>
</book>
使用属性表示相同信息:
<book id="1" title="XML基础" language="中文"></book>
最佳实践: 一般来说,核心数据应该使用元素表示,而用于标识或分类的元数据可以使用属性表示。如果数据需要嵌套结构或可能有多个值,始终使用元素。
当使用来自不同来源的XML文档或在一个文档中混合不同类型的内容时,可能会出现元素名称冲突。XML命名空间提供了解决这个问题的方法。
命名空间使用xmlns属性声明,通常指向唯一的URI:
<root xmlns:h="http://www.w3.org/HTML/1998/html4"
xmlns:f="http://www.furniture.org/items">
<h:table> <!-- HTML表格 -->
<h:tr>
<h:td>数据</h:td>
</h:tr>
</h:table>
<f:table> <!-- 家具桌子 -->
<f:name>餐桌</f:name>
<f:width>80</f:width>
<f:length>120</f:length>
</f:table>
</root>
也可以定义默认命名空间,应用于所有没有前缀的元素:
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<title>默认命名空间示例</title>
</head>
<body>
<h1>这里的所有元素都属于默认命名空间</h1>
</body>
</html>
XML处理指令向应用程序提供特殊指令。它们以<?开始,以?>结束:
<?xml version="1.0" encoding="UTF-8"?> <!-- XML声明是最常见的处理指令 -->
<?xml-stylesheet type="text/xsl" href="style.xsl"?> <!-- 应用XSLT样式表 -->
XML文档可以引用文档类型定义(DTD)或XML Schema,用于验证文档:
<!-- 使用DTD -->
<?xml version="1.0"?>
<!DOCTYPE bookstore SYSTEM "bookstore.dtd">
<bookstore>...</bookstore>
<!-- 使用XML Schema -->
<?xml version="1.0"?>
<bookstore xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:noNamespaceSchemaLocation="bookstore.xsd">
...
</bookstore>
注意: 良好结构的XML文档是指语法正确的文档,而有效的XML文档是指符合DTD或Schema定义的文档。一个XML文档可以是良好结构的,但不一定有效(如果它不符合指定的DTD或Schema)。