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 有两个版本。

  1. XML 1.0
  2. 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 编码类型。

  1. UTF-8:UTF-8 使用 8 位来表示字符。
  2. 示例

    <?xml version="1.0" encoding="UTF-8"?>
    
  3. UTF-16

它使用 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>

注意:AGEAgeage 在 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 &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 DOM
XML DOM 示例

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
  • 价格 – 付费(最新价格请参考下方网站

链接:https://www.oxygenxml.com/


5) Xmplify

Xmplify XML Editor 提供了一个完全 XML 感知的编辑环境,具有基于 DTD 和 XML Schema 的自动补全、自动文档验证等功能。

关键统计数据

  • 类型 – XML 编辑器
  • 开发者 – MOSO Corporation
  • 支持的操作系统 – Mac OS。
  • 价格 – 付费(最新价格请参考下方网站

链接: http://xmplifyapp.com/

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 规则。
  • 命名空间有助于避免元素名称冲突。