XML 教程供初学者
什么是 XML?
XML 代表可扩展标记语言 (eXtensible Markup Language)。它是一种使用标记并且可以扩展的语言(不是编程语言)。它源自 **S**tandard Generalized Markup Language (SGML)。XML 也使用 DTD(**D**ocument **T**ype **D**efinitions,文档类型定义)来定义 XML 文档结构。
XML 不用于处理计算操作和算法。因此,XML 不是一种编程语言。主要目标是传输数据,而不是显示信息。XML 弥合了人类可读性和机器可读性之间的差距。与 HTML 标签不同,XML 标签是自描述的。
XML 是一种开放格式。XML 的文件名扩展名为 .xml
XML 历史
XML 起源于 1996 年,并于 1998 年首次发布。**万维网联盟** (World Wide Web Consortium) 是 **XML** 的开发者,并于 1998 年成为 **W3C 推荐**。
XML 有两个版本。
- XML 1.0
- XML 1.1
XML 1.1 是最新版本。然而,**XML 1.0** 是使用最广泛的版本。
XML 编辑器有
- Tim Bray,
- Jean Paoli,
- C. M. Sperberg,
- Eve Maler,
- François Yergeau。
XML 特性
以下是 XML 的一些重要特性
- 它是可扩展且人类可读的。
- 它与平台和语言无关。
- 它保留了空格。
- 整体的简洁性。
- 自描述性。
- 它将数据与 HTML 分离。
- XML 标签不是预定义的。您需要定义自己的自定义标签。
- XML 的设计目的是传输数据,而不是显示数据。
- XML 的标记代码易于人类理解。
- 结构良好的格式易于程序读取和写入。
- XML 是一种可扩展的标记语言,与 HTML 类似。
XML 编码
编码是将 Unicode 字符转换为其二进制表示形式。UTF 用于 XML 编码。UTF 代表 **U**niversal Character Set (UCS 代表通用字符集) **T**ransformation **Format (转换格式)。
主要有两种 UTF 编码类型。
- UTF-8:UTF-8 使用 8 位来表示字符。
- UTF-16
示例
<?xml version="1.0" encoding="UTF-8"?>
它使用 16 位来表示字符。
示例
<?xml version="1.0" encoding="UTF-16"?>
您可以在 XML 声明中使用编码。UTF-8 是 XML 中的默认编码。
XML 语法
以下代码片段显示了基本的 XML 语法。
<?xml version = "1.0" encoding = "UTF-8" ?> <root> <child> <subchild>.....</subchild> </child> </root>
XML 声明
XML 声明包括 XML 版本、字符编码或/和独立状态。声明是可选的。
XML 声明的语法
以下代码片段显示了 XML 声明的语法。
<?xml version="version_number," encoding="character_encoding" standalone="yes_or_no" ?>
XML 声明规则
以下是 XML 声明规则。
- 如果 XML 声明存在,它必须是第一个出现的内容。
- XML 声明区分大小写,并且必须以小写的 **<?xml** 开头。
- 它没有结束标签。
XML 声明示例
以下代码片段显示了一个 XML 声明的示例。
<?xml version="1.0" encoding="UTF-8" standalone="no" ?>
XML 注释
注释是可选的。添加注释有助于理解文档内容。
XML 注释的语法
注释以 **<!–** 开始,以 **–>** 结束。
以下代码片段显示了 XML 注释的语法。
<!-- Add your comment here -->
XML 标签和元素
除了声明,标签通常成对出现。每个标签对都包含一个**开始标签**(也称为**起始标签**)和一个**结束标签**(也称为**终止标签**)。
标签名称用 **<>** 包围。对于特定的标签对,开始和结束标签必须相同,只是结束标签在 **<** 之后有一个 **/**。
<name>...</name>
开始和结束标签之间的任何内容都称为**内容**。
开始标签、内容和结束标签合在一起称为一个**元素**。
Opening tag + content + closing tag = an element
注意:元素也可以包含属性。您很快就会学到属性。
让我们看下面的元素。
<age>20</age>
在上面的元素中,
- **age** 是**元素的名称**。
注意:标签名称也称为**元素**或**元素名称**。
- <age> – 开始标签
- 25 – 内容
- </age> – 结束标签。
如果标签之间没有内容,如下所示,则称为**空标签**。
<result></result>
XML 标签和元素规则
以下列表显示了 XML 标签和元素规则。
- 标签区分大小写。
示例
正确
<age>20</age>
错误
<age>20</Age>
注意:AGE、Age 和 age 在 XML 中是三个不同的名称。
- 所有 XML 文档都必须包含一个根元素。
- 所有元素都必须有结束标签(除了声明)。
- 标签名称必须以字母或下划线开头,并且不能以 **XML** 开头。
- 标签名称可以包含字母、数字、连字符、下划线和句点。连字符、下划线和句点是唯一允许的标点符号。
- 标签名称不能包含空格。
- 所有元素必须正确嵌套。
示例
正确
<b><u>This text is bold and italic</u></b>
错误
<b><u>This text is bold and italic.</b></u>
XML 属性
元素的属性放在开始标签的标签名称之后。您可以用不同的属性名称为单个元素添加多个属性。
让我们来看下面的 XML 文档。
<company name="ABC Holdings" location="London"> <chairman>Mr. John</chairman> <gm>Mr. Wood</gm> </company>
在 **company** 元素中有两个属性,即 **name** 和 **location**。
让我们研究一下 **name** 属性,
- name=”ABC Holdings” – 一个属性
- name – 属性名称
- ABC Holdings – 属性值
注意:**属性名称**也称为**属性**。
另外,请注意,在上面的示例中,**company** 是**根**元素。
XML 属性规则
以下列表显示了 XML 属性规则。
- 属性值必须用引号括起来。
- 一个元素不能包含多个同名的属性。
属性与元素
您仍然对属性和元素的区别感到困惑吗?这里有另一个例子。
让我们来看下面给出的文档 A 和 B。
文档 A
<teacher subject="English"> <name>Mr. John</name>. <qualification>Graduate</qualification> </teacher>
文档 B
<teacher> <subject>English</subject> <name>Mr. John</name> <qualification>Graduate</qualification> </teacher>
在文档 A 中,**subject** 是一个**属性**。
在文档 B 中,**subject** 是一个**元素**。
XML 实体
什么是 XML 实体?
简单来说,实体是表示特殊字符的一种方式。实体也称为**实体引用**。
为什么需要 XML 实体?
某些字符(例如 **“**、**&** **<** 等)在 XML 中是保留的。它们被称为**特殊字符**,不能直接用于其他目的。
例如,**<** 和 **>** 符号用于**标签**。您不能直接从键盘输入“小于号”和“大于号”。相反,您需要使用实体。
下表显示了一些常用的 XML 实体。
字符 | 描述 | 实体名称 | 用途 |
---|---|---|---|
“ | 引号(双引号) | quot | " |
& | 和号 | amp | & |
‘ | 撇号(单引号) | apos | ' |
< | 小于号 | lt | < |
> | 大于号 | gt | > |
示例
<friend> <name>My friends are Alice & Jane.</name> </friend>
HTML 与 XML
HTML 和 XML 之间的相似之处
以下列表显示了 HTML 和 XML 之间的相似之处。
- 两者都是开放格式。
- 两者都是标记语言。
- 两者都使用标签和属性来描述内容。
HTML 和 XML 之间的区别
尽管 XML 类似于 HTML,但 XML 并不是 HTML 的替代品。HTML 和 XML 之间也存在一些显著的区别。
下表显示了 HTML 和 XML 之间的比较。
HTML | XML | |
---|---|---|
代表 | 超文本标记语言 | 可扩展标记语言 |
语言类型 | 预定义的标记语言。 | 用于指定标记语言的框架。 |
结构细节 | 未提供。 | 提供。 |
目的 | 用于显示数据。 | 用于传输数据 |
由...驱动 | 格式驱动。 | 内容驱动。 |
性质 | 具有静态性质。 | 具有动态性质。 |
标签类型 | 预定义标签。 | 用户自定义标签。 |
标签限制 | 标签数量有限。 | 标签是可扩展的。 |
结束标签 | 不一定需要使用结束标签(但建议使用结束标签)。 | 结束标签是强制性的。 |
命名空间支持 | 不支持。 | 支持。 |
区分大小写 | 标签不区分大小写。 | 标签区分大小写。 |
空格 | 空格无法保留(可以忽略空格)。 | 空格保留(无法忽略空格)。 |
JavaScript 中的解析 | 不需要额外的应用程序。 | 需要 DOM 实现。 |
代码嵌套 | 不一定需要。 | 需要。 |
错误 | 可以忽略小的错误。 | 不允许错误。 |
文件名扩展名 | .html 或 .htm | .xml |
大小 | 相对较大。 | 相对较小。 |
引号 | 属性值不需要引号。 | XML 属性值需要。 |
对象支持 | 提供本机对象支持。 | 对象必须通过约定来表示。 |
Null 支持 | 本机识别 null 值。 | 需要在元素上使用 xsi:nil。 |
格式化决策 | 为应用程序数据提供直接映射。 | 需要更多精力。 |
学习曲线 | 与 XML 相比,学习曲线更平缓。 | 陡峭的学习曲线。 |
网站 | https://html.whatwg.cn/ | https://www.w3.org/TR/xml11/ |
基本 HTML 语法
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta http-equiv="X-UA-Compatible" content="IE=edge"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>Document</title> </head> <body> </body> </html>
基本 XML 语法
<?xml version = "1.0" encoding = "UTF-8" ?> <root> <child> <subchild>.....</subchild> </child> </root>
HTML 和 XML 的相同示例
使用 HTML
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta http-equiv="X-UA-Compatible" content="IE=edge"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>Document</title> </head> <body> <p>Book</p> <p>Name: Anna Karenina</p> <p>Author: Leo Tolstoy</p> <p>Publisher: The Russian Messenger</p> </body> </html>
使用 XML
<?xml version = "1.0" encoding = "UTF-8" ?> <book> <name>Anna Karenina</name> <author>Leo Tolstoy</author> <publisher>The Russian Messenger</publisher> </book>
JSON 与 XML
JSON 和 XML 之间的相似之处
以下列表显示了 JSON 和 XML 之间的相似之处。
- 两者都是开放格式。
- 两者都是自描述的。
- 两者都有层次结构。
- 两者都可以被多种编程语言解析和使用。
JSON 和 XML 之间的区别
XML 和 JSON 之间也有一些区别。
下表显示了 JSON 和 XML 之间的比较。
JSON | XML | |
---|---|---|
代表 | JavaScript 对象表示法 | 可扩展标记语言 |
扩展自 | JavaScript | SGML |
数据存储 | 数据存储为键值对。 | 数据存储为树状结构。 |
命名空间 | 不支持命名空间。 | 支持命名空间。 |
评论 | 不支持添加注释。 | 可以添加注释。 |
数据可访问性 | 可作为 JSON 对象轻松访问。 | 数据需要解析。 |
元数据 | 不支持添加元数据。 | 可以编写元数据。 |
类型 | JSON 类型:字符串、数字、数组、布尔值。 | 所有 XML 数据都应为字符串。 |
数据类型支持 | 仅支持文本和数字数据类型。 | 支持多种数据类型(文本、数字、图像等) |
数组支持 | 比 XML 对数组的支持更多。 | 对数组支持较少或不支持。 |
对象支持 | 对对象的原生支持。 | 对象必须通过约定来表示。 |
AJAX 工具包支持 | 支持。 | 不支持。 |
检索值 | 容易。 | 困难。 |
反序列化/序列化 | 完全自动化。 | 开发人员必须编写 JavaScript 代码。 |
浏览器支持 | 大多数浏览器支持。 | 跨浏览器 XML 解析可能很棘手。 |
编码 | 仅支持 UTF-8 编码。 | 它支持各种编码。 |
显示能力 | 无显示能力。 | 提供显示能力。 |
文档大小 | 比 XML 小。 | 比 JSON 大。 |
文件名扩展名 | .json | .xml |
安全性 | 安全性较低。 | 比 JSON 更安全。 |
易于阅读 | 相对容易。 | 相对困难。 |
学习曲线 | 易于学习。 | 陡峭的学习曲线。 |
网站 | https://www.json.org/json-en.html | https://www.w3.org/TR/xml11/ |
基本 JSON 语法
{string:value, .......}
JSON 和 XML 的相同示例
使用 JSON
{"books":[ {"name":"Anna Karenina", "author":"Leo Tolstoy"}, {"name":"One Hundred Years of Solitude", "author":"Gabriel Garcia Marquez"}, {"name":"The Great Gatsby", "author":"Scott Fitzgerald"}, {"name":"Invisible Man", "author":"Ralph Ellison"} ]}
使用 XML
<?xml version = "1.0" encoding = "UTF-8" ?> <books> <book> <name>Anna Karenina</name> <author>Leo Tolstoy</author> </book> <book> <name>One Hundred Years of Solitude</name> <author>Gabriel Garcia Marquez</author> </book> <book> <name>The Great Gatsby</name> <author>Scott Fitzgerald</author> </book> <book> <name>Invisible Man</name> <author>Ralph Ellison</author> </book> </books>
XML DTD
什么是 DTD?
DTD 代表 **D**ocument **T**ype **D**efinition(文档类型定义)。它使用一些合法的元素定义 XML 文档的结构。XML DTD 是可选的。
DTD 规则
以下列表显示了 DTD 规则。
- 如果 DTD 存在,它必须出现在文档的开头(只有 XML 声明可以出现在 DTD 之上)。
- 元素声明必须以 **!** 标记开头。
- DTD 名称和根元素的元素类型必须相同。
DTD 示例
内部 DTD 示例
<?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE student [ <!ELEMENT student (firstname,lastname,school)> <!ELEMENT firstname (#PCDATA)> <!ELEMENT lastname (#PCDATA)> <!ELEMENT school (#PCDATA)> ]> <student> <firstname>Mark</firstname> <lastname>Wood</lastname> <school>Hills College</school> </student>
在上面的示例中,
- **!DOCTYPE student** 表示 DTD 声明的开始。而 **student** 是 XML 文档的根元素。
- **!ELEMENT student** 表示 **student** 元素必须包含 **firstname**、**lastname** 和 **school** 元素。
- **!ELEMENT firstname** 表示 **firstname** 元素是 **#PCDATA**(**P**arsed **C**haracter **Data,已解析字符数据)类型。
- **!ELEMENT lastname** 表示 **lastname** 元素是 **#PCDATA** 类型。
- **!ELEMENT school** 表示 **school** 元素是 **#PCDATA** 类型。
外部 DTD 示例
<?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE student SYSTEM "student.dtd"> <student> <firstname>Mark</firstname> <lastname>Wood</lastname> <school>Hills College</school> </student>
DTD 文件内容(student.dtd)如下。
<!ELEMENT student (firstname,lastname,school)> <!ELEMENT firstname (#PCDATA)> <!ELEMENT lastname (#PCDATA)> <!ELEMENT school (#PCDATA)>
XML DOM
什么是 DOM?
DOM 代表 **D**ocument **Object **Model(文档对象模型)。它定义了一种访问和操作 XML 文档的标准方式。DOM 具有(分层的)树状结构。
DOM 示例
让我们来看下面的 XML 文档。
<?xml version="1.0" encoding="UTF-8" ?> <school> <student> <name> <first_name>Alex</first_name> <last_name>Clarke</last_name> </name> <age>14</age> <address>No. 35, Flower Road, Leeds</address> </student> </school>
上述 XML 文件的树状结构将如下所示。
XML 验证
什么是格式正确的 XML 文档?
**格式正确**的 XML 文档是语法正确的 XML 文档。
什么是有效 XML 文档?
**有效**的 XML 文档是格式正确的,并且还符合 DTD 规则。
XML 命名空间
为什么需要命名空间?
命名空间有助于避免元素名称冲突。
命名空间声明
以下显示了命名空间声明的语法。
<element xmlns:name="URL">
在上面的声明中,
- **xmlns** 关键字表示命名空间的开始。
- **name** 是命名空间的前缀。
- **URL** 是命名空间标识符。
命名空间示例
以下代码片段显示了一个命名空间的示例。
<?xml version="1.0" encoding="UTF-8" ?> <abt:about xmlns:abt="https://guru99.com.cn/about-us.html"> <abt:founder>Krishna</abt:founder> <abt:vision>Fun and Free Education for ALL</abt:vision> </abt:about>
XML 编辑器
有几种 XML 编辑器可用。任何文本编辑器(如记事本等)都可以用作 XML 编辑器。
以下列表显示了 2021 年一些流行的 XML 编辑器。
1) XML Notepad
XML Notepad 是一个开源的 XML 编辑器。它在左侧窗格中具有树状视图和 XSL 输出,在右侧窗格中具有节点文本。它在底部有一个错误调试窗口。
关键统计数据
- 类型 – XML 编辑器
- 开发者 – Microsoft
- 支持的操作系统 – Microsoft Windows。
- 价格 – 免费
链接: https://msdocs.cn/XmlNotepad/
2) Stylus Studio
Stylus Studio 是一个用 C++ 编写的可扩展标记语言 (XML) 的 IDE。它允许用户编辑和转换 XML 文档,以及电子数据交换 (EDI)、CSV 和关系数据等数据。
关键统计数据
- 类型 – XML 集成开发环境 (IDE)
- 开发者 – Progress Software Corporation
- 支持的操作系统 – Microsoft Windows。
- 价格 – 付费(最新价格请参考下方网站),提供免费试用。
链接: http://www.stylusstudio.com/
3) Altova XMLSpy
XMLSpy 主要作为 JSON 和 XML 编辑器进行营销。它具有内置的模式设计器和编辑器。它包括 Visual Studio 和 Eclipse 集成。
关键统计数据
- 类型 – XML 编辑器
- 开发者 – Altova
- 支持的操作系统 – Microsoft Windows。
- 价格 – 付费(最新价格请参考下方网站),提供免费试用。
链接:https://www.altova.com/xmlspy-xml-editor
4) Oxygen XML Editor
Oxygen XML 是一个用 Java 开发的跨平台编辑器。它有助于验证 DTD、W3C XML Schema、RELAX NG、Schematron、NRL 和 NVDL 等模式。
关键统计数据
- 类型 – XML 编辑器
- 开发者 – SyncRO Soft Ltd
- 支持的操作系统 – Windows、Linux 和 Mac OS X
- 价格 – 付费(最新价格请参考下方网站
5) Xmplify
Xmplify XML Editor 提供了一个完全 XML 感知的编辑环境,具有基于 DTD 和 XML Schema 的自动补全、自动文档验证等功能。
关键统计数据
- 类型 – XML 编辑器
- 开发者 – MOSO Corporation
- 支持的操作系统 – Mac OS。
- 价格 – 付费(最新价格请参考下方网站
XML 解析器
XML 解析器是一个提供与 XML 文档交互接口的软件库。它检查 XML 文档的格式是否正确。一些解析器还可以验证 XML 文档。当今的浏览器都带有 XML 解析器。
SAX
**SAX** 代表 **Simple API for XML(XML 简单 API)。它是一个用于解析 XML 文档的**应用程序编程接口** (API)。它们的行为类似于 Java 中的事件处理程序。
与 DOM 不同,SAX 是一个事件驱动的 XML 解析器的例子。
以下是 SAX 和 DOM 之间的一些重要区别。
SAX | DOM | |
---|---|---|
代表 | XML 简单 API | 文档对象模型 |
解析器类型 | 基于事件 | 基于对象 |
读写 XML | 只读 | 都读写 |
插入/更新/删除节点 | 不能插入/更新/删除节点 | 可以插入/更新/删除节点 |
内存效率 | 内存效率高 | 不确定 |
速度 | 比 DOM 解析器慢 | 比 SAX 解析器快 |
适用于 | 小型文件 | 大型文件 |
XML 数据绑定
XML 数据绑定是将 XML 文档中的数据表示为计算机内存中的业务对象。
XML 数据绑定有三种方法。
- **基于 XML Schema 的数据绑定:** 根据 Schema 创建相应的 XML 类。
- **基于类的绑定:** 根据类创建相应的 XML Schema。
- **基于映射的绑定:** 它描述了现有的 XML Schema 如何映射到一组类(反之亦然)。
还有 XML 数据绑定框架。
示例
使用框架进行 XML 数据绑定很简单。数据绑定框架为您生成大量代码。您需要提供 DTD 或 XML Schema。
XML Schema
XML **Schema**(也称为 **XML Schema Definition** 或 **XSD**)用于描述 XML 文档的结构。它是 DTD 的替代方案。
为什么 Schema 很重要?
DTD 的功能不如 Schema 强大,因为它不够可扩展和灵活。因此,它可能不适用于某些情况。在这种情况下,Schema 很重要。使用 XML Schema 的主要目的是定义 XML 文档的元素和属性。
XML Schema 与 DTD 有何不同?
以下比较显示了 XSD(XML Schema)与 DTD 的不同之处。
DTD | XSD | |
---|---|---|
代表 | 文档类型定义 | XML Schema 定义 |
可扩展性 | 不可扩展 | 可扩展 |
对 XML 结构的控制 | 控制较少 | 更多控制 |
数据类型支持 | 不支持 | 支持 |
命名空间支持 | 不支持 | 支持 |
以下代码片段显示了一个 XML Schema 的示例。
xs:schema xmlns:xs = "http://www.w3.org/2001/XMLSchema"> <xs:element name = "employee"> <xs:complexType> <xs:sequence> <xs:element name = "firstname" type = "xs:string" /> <xs:element name = "lastname" type = "xs:string" /> <xs:element name = "phone" type = "xs:int" /> </xs:sequence> </xs:complexType> </xs:element> </xs:schema>
XML 的优点
这里是 XML 的好处/优势
- 它使得数据传输和共享变得容易。
- XML 改善了不同平台之间的数据交换。
- 它是一种标记语言,即放置在文本文档中的一组字符或符号。
- XML 指示 XML 文档显示后应如何显示。
- 它简化了平台更改过程。
- 它增强了数据的可用性。
- 它支持多语言文档和 Unicode。
- 相对容易学习和编码。
- 它是一种标记语言,即放置在文本文档中的一组字符或符号。
- 它使用 DTD 和 Schema 执行验证。
- 使文档能够跨系统和应用程序传输。借助 XML,您可以快速地在不同平台之间交换数据。
- XML 将数据与 HTML 分离。
XML 的缺点
以下是使用 XML 的缺点/不足之处
- XML 需要处理应用程序。
- XML 语法与其他替代的“基于文本”的数据传输格式相似,有时会令人困惑。
- 无内置数据类型支持
- XML 语法是冗余的。
- 不允许用户创建自己的标签。
摘要
- XML 代表可扩展标记语言。XML 是一种语言(不是编程语言),它使用标记并且可以扩展。
- 主要目标是传输数据,而不是显示数据。
- XML 1.1 是最新版本。然而,XML 1.0 是使用最广泛的版本。
- 除了声明,标签通常成对出现。
- 开始标签 + 内容 + 结束标签 = 一个元素
- 实体是表示特殊字符的一种方式。
- DTD 代表文档类型定义。它使用一些合法的元素定义 XML 文档的结构。XML DTD 是可选的。
- DOM 代表文档对象模型。它定义了一种访问和操作 XML 文档的标准方式。
- 格式正确的 XML 文档是语法正确的 XML 文档。
- 有效的 XML 文档是格式正确的,并且还符合 DTD 规则。
- 命名空间有助于避免元素名称冲突。