XML 快速指南



XML - 概述

XML 代表可扩展标记语言 (Extensible Markup Language)。它是一种基于文本的标记语言,源自标准通用标记语言 (SGML)。

XML 标签标识数据,用于存储和组织数据,而不是像 HTML 标签那样指定如何显示数据(HTML 标签用于显示数据)。XML 在不久的将来不会取代 HTML,但它通过采用 HTML 的许多成功特性引入了新的可能性。

XML 有三个重要的特性使其在各种系统和解决方案中都非常有用:

  • XML 是可扩展的 - XML 允许您创建适合您应用程序的自己的自描述标签或语言。

  • XML 传输数据,不呈现数据 - XML 允许您存储数据,而不管它将如何呈现。

  • XML 是公共标准 - XML 由万维网联盟 (W3C) 开发,是一个开放标准。

XML 用途

XML 用途简要列表如下:

  • XML 可以幕后工作,简化大型网站 HTML 文档的创建。

  • XML 可用于在组织和系统之间交换信息。

  • XML 可用于数据库的卸载和重新加载。

  • XML 可用于存储和组织数据,可以定制您的数据处理需求。

  • XML 可以轻松与样式表合并,以创建几乎任何所需的输出。

  • 实际上,任何类型的数据都可以表示为 XML 文档。

什么是标记?

XML 是一种标记语言,它定义了一组规则,用于以既可人读又可机器读的格式编码文档。那么什么是标记语言呢?标记是添加到文档中的信息,它以某种方式增强了文档的含义,因为它标识了文档的各个部分以及它们之间的关系。更具体地说,标记语言是一组符号,可以放置在文档的文本中以划分和标记该文档的各个部分。

以下示例显示了嵌入在文本中的 XML 标记的外观:

<message>
   <text>Hello, world!</text>
</message>

此代码片段包含标记符号或标签,例如 <message>...</message> 和 <text>... </text>。标签 <message> 和 </message> 标记 XML 代码片段的开始和结束。标签 <text> 和 </text> 包含文本 Hello, world!。

XML 是一种编程语言吗?

编程语言由语法规则和自己的词汇表组成,用于创建计算机程序。这些程序指示计算机执行特定任务。XML 不符合编程语言的资格,因为它不执行任何计算或算法。它通常存储在简单的文本文件中,并由能够解释 XML 的专用软件处理。

XML - 语法

在本节中,我们将讨论编写 XML 文档的简单语法规则。以下是完整的 XML 文档:

<?xml version = "1.0"?>
<contact-info>
   <name>Tanmay Patil</name>
   <company>TutorialsPoint</company>
   <phone>(011) 123-4567</phone>
</contact-info>

您会注意到上面的示例中有两种信息:

  • 标记,如 <contact-info>

  • 文本或字符数据,Tutorials Point(040) 123-4567

下图描述了在 XML 文档中编写不同类型标记和文本的语法规则。

XML Syntax Rules

让我们详细了解上图的每个组件。

XML 声明

XML 文档可以选择包含 XML 声明。它写成如下:

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

其中version 是 XML 版本,encoding 指定文档中使用的字符编码。

XML 声明的语法规则

  • XML 声明区分大小写,必须以“<?xml>”开头,其中“xml”小写。

  • 如果文档包含 XML 声明,则它必须严格作为 XML 文档的第一个语句。

  • XML 声明必须严格作为 XML 文档中的第一个语句。

  • HTTP 协议可以覆盖您在 XML 声明中设置的encoding 值。

标签和元素

XML 文件由多个 XML 元素构成,也称为 XML 节点或 XML 标签。XML 元素的名称用三角括号 < > 括起来,如下所示:

<element>

标签和元素的语法规则

元素语法 - 每个 XML 元素都需要用开始元素或结束元素关闭,如下所示:

<element>....</element>

或者在简单情况下,只需这样:

<element/>

元素嵌套 - XML 元素可以包含多个 XML 元素作为其子元素,但子元素不能重叠。即,元素的结束标签必须与最近的不匹配的开始标签具有相同的名称。

以下示例显示了嵌套标签不正确:

<?xml version = "1.0"?>
<contact-info>
<company>TutorialsPoint
</contact-info>
</company>

以下示例显示了嵌套标签正确:

<?xml version = "1.0"?>
<contact-info>
   <company>TutorialsPoint</company>
<contact-info>

根元素 - XML 文档只能有一个根元素。例如,以下不是正确的 XML 文档,因为xy 元素都出现在顶级,没有根元素:

<x>...</x>
<y>...</y>

以下示例显示了一个格式正确的 XML 文档:

<root>
   <x>...</x>
   <y>...</y>
</root>

大小写敏感性 - XML 元素的名称区分大小写。这意味着开始元素和结束元素的名称必须完全相同。

例如,<contact-info><Contact-Info> 不同

XML 属性

属性使用名称/值对指定元素的单个属性。XML 元素可以有一个或多个属性。例如:

<a href = "https://tutorialspoint.com/">Tutorialspoint!</a>

这里href 是属性名称,https://tutorialspoint.com/ 是属性值。

XML 属性的语法规则

  • XML 中的属性名称(与 HTML 不同)区分大小写。也就是说,HREFhref 被认为是两个不同的 XML 属性。

  • 同一属性在一个语法中不能有两个值。以下示例显示了不正确的语法,因为属性b 被指定了两次

<a b = "x" c = "y" b = "z">....</a>
  • 属性名称无需用引号定义,而属性值必须始终用引号括起来。以下示例演示了不正确的 xml 语法

<a b = x>....</a>

在上例语法中,属性值没有用引号定义。

XML 引用

引用通常允许您在 XML 文档中添加或包含其他文本或标记。引用始终以符号"&"(这是一个保留字符)开头,并以符号";" 结尾。XML 有两种类型的引用:

  • 实体引用 - 实体引用包含开始和结束分隔符之间的名称。例如&amp;,其中ampnamename 指的是预定义的文本和/或标记字符串。

  • 字符引用 - 这些包含引用,例如&#65;,包含一个井号 (“#”),后跟一个数字。该数字始终指字符的 Unicode 代码。在这种情况下,65 指字母“A”。

XML 文本

XML 元素和 XML 属性的名称区分大小写,这意味着开始元素和结束元素的名称需要使用相同的大小写。为了避免字符编码问题,所有 XML 文件都应保存为 Unicode UTF-8 或 UTF-16 文件。

XML 元素之间和 XML 属性之间的空格字符(如空格、制表符和换行符)将被忽略。

某些字符被 XML 语法本身保留。因此,不能直接使用它们。要使用它们,可以使用一些替代实体,如下所示:

不允许使用的字符 替代实体 字符描述
< &lt; 小于
> &gt; 大于
& &amp; 和号
' &apos; 撇号
" &quot; 引号

XML - 文档

XML 文档是由元素和其他标记组成的有序包中的 XML 信息的基本单元。XML 文档可以包含各种各样的数据。例如,数字数据库、表示分子结构的数字或数学方程式。

XML 文档示例

以下示例显示了一个简单的文档:

<?xml version = "1.0"?>
<contact-info>
   <name>Tanmay Patil</name>
   <company>TutorialsPoint</company>
   <phone>(011) 123-4567</phone>
</contact-info>

下图描述了 XML 文档的各个部分。

XML Document

文档序言部分

文档序言位于文档的顶部,位于根元素之前。本节包含:

  • XML 声明
  • 文档类型声明

您可以在本章中了解有关 XML 声明的更多信息:XML 声明

文档元素部分

文档元素是 XML 的构建块。它们将文档划分为一个层次结构的部分,每个部分都具有特定的用途。您可以将文档分成多个部分,以便可以以不同的方式呈现它们,或被搜索引擎使用。元素可以是容器,包含文本和其他元素的组合。

您可以在本章中了解有关 XML 元素的更多信息:XML 元素

XML - 声明

本章详细介绍了 XML 声明。XML 声明包含准备 XML 处理器解析 XML 文档的详细信息。它是可选的,但如果使用,则必须出现在 XML 文档的第一行。

语法

以下语法显示 XML 声明:

<?xml
   version = "version_number"
   encoding = "encoding_declaration"
   standalone = "standalone_status"
?>

每个参数都包含一个参数名称、一个等号 (=) 和一个带引号的参数值。下表详细显示了上述语法:

参数 参数值 参数描述
版本 1.0 指定使用的 XML 标准版本。
编码 UTF-8、UTF-16、ISO-10646-UCS-2、ISO-10646-UCS-4、ISO-8859-1 到 ISO-8859-9、ISO-2022-JP、Shift_JIS、EUC-JP 它定义文档中使用的字符编码。UTF-8 是使用的默认编码。
独立 yes 或 no 它通知解析器文档是否依赖于外部源(例如外部文档类型定义 (DTD))的信息来获取其内容。默认值为no。将其设置为yes 将告诉处理器解析文档不需要任何外部声明。

规则

XML 声明应遵守以下规则:

  • 如果 XML 中存在 XML 声明,则必须将其放置在 XML 文档的第一行。

  • 如果包含 XML 声明,则必须包含版本号属性。

  • 参数名称和值区分大小写。

  • 名称始终小写。

  • 参数放置的顺序很重要。正确的顺序是:version、encoding 和 standalone。

  • 可以使用单引号或双引号。

  • XML 声明没有结束标签,即</?xml>

XML 声明示例

以下是 XML 声明的一些示例:

没有参数的 XML 声明:

<?xml >

带有版本定义的 XML 声明:

<?xml version = "1.0">

定义了所有参数的 XML 声明:

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

使用单引号定义所有参数的XML声明 -

<?xml version = '1.0' encoding = 'iso-8859-1' standalone = 'no' ?>

XML - 标签

让我们学习XML最重要的部分之一:XML标签。XML标签构成了XML的基础。它们定义了XML中元素的范围。它们还可以用于插入注释,声明解析环境所需的设置以及插入特殊指令。

我们可以将XML标签大致分为以下几类:

开始标签

每个非空XML元素的开头都用开始标签标记。以下是开始标签的示例:

<address>

结束标签

每个具有开始标签的元素都应该以结束标签结尾。以下是结束标签的示例:

</address>

请注意,结束标签在元素名称之前包含一个斜杠("/")。

空标签

出现在开始标签和结束标签之间的文本称为内容。没有内容的元素称为空元素。空元素可以用以下两种方式表示:

开始标签紧跟结束标签,如下所示:

<hr></hr>

完整的空元素标签如下所示:

<hr />

空元素标签可以用于任何没有内容的元素。

XML标签规则

以下是使用XML标签时需要遵循的规则:

规则1

XML标签区分大小写。以下代码行是错误语法`

`的示例,因为两个标签的大小写不同,这在XML中被视为错误语法。

<address>This is wrong syntax</Address>

以下代码显示了正确的方法,我们使用相同的大小写来命名开始和结束标签。

<address>This is correct syntax</address>

规则2

必须按正确的顺序关闭XML标签,即,在另一个元素内部打开的XML标签必须在外部元素关闭之前关闭。例如:

<outer_element>
   <internal_element>
      This tag is closed before the outer_element
   </internal_element>
</outer_element>

XML - 元素

XML元素可以定义为XML的构建块。元素可以作为容器来容纳文本、元素、属性、媒体对象或所有这些。

每个XML文档包含一个或多个元素,其范围由开始和结束标签分隔,或者对于空元素,由空元素标签分隔。

语法

以下是编写XML元素的语法:

<element-name attribute1 attribute2>
....content
</element-name>

其中:

  • element-name是元素的名称。其名称在开始和结束标签中的大小写必须匹配。

  • attribute1, attribute2是元素的属性,用空格分隔。属性定义了元素的属性。它将名称与值相关联,值是字符字符串。属性的写法如下:

name = "value"

name后跟一个=号和一个用双引号(" ")或单引号(' ')括起来的字符串value

空元素

空元素(没有内容的元素)具有以下语法:

<name attribute1 attribute2.../>

以下是用各种XML元素编写的XML文档示例:

<?xml version = "1.0"?>
<contact-info>
   <address category = "residence">
      <name>Tanmay Patil</name>
      <company>TutorialsPoint</company>
      <phone>(011) 123-4567</phone>
   </address>
</contact-info>

XML元素规则

XML元素需要遵循以下规则:

  • 元素名称可以包含任何字母数字字符。名称中唯一允许的标点符号是连字符 (-)、下划线 (_) 和句点 (.)。

  • 名称区分大小写。例如,Address、address和ADDRESS是不同的名称。

  • 元素的开始和结束标签必须相同。

  • 元素作为容器,可以包含文本或元素,如上例所示。

XML - 属性

本章描述了XML属性。属性是XML元素的一部分。一个元素可以有多个唯一的属性。属性提供了关于XML元素的更多信息。更准确地说,它们定义了元素的属性。XML属性始终是名称-值对。

语法

XML属性具有以下语法:

<element-name attribute1 attribute2 >
....content..
< /element-name>

其中attribute1attribute2具有以下形式:

name = "value"

value必须用双引号(" ")或单引号(' ')括起来。这里,attribute1attribute2是唯一的属性标签。

属性用于为元素添加唯一的标签,将标签放在类别中,添加布尔标志,或将其与某些数据字符串关联。以下示例演示了属性的使用:

<?xml version = "1.0" encoding = "UTF-8"?>
<!DOCTYPE garden [
   <!ELEMENT garden (plants)*>
   <!ELEMENT plants (#PCDATA)>
   <!ATTLIST plants category CDATA #REQUIRED>
]>

<garden>
   <plants category = "flowers" />
   <plants category = "shrubs">
   </plants>
</garden>

当您不想为每种情况创建一个新元素时,属性用于区分同名元素。因此,使用属性可以更详细地区分两个或多个相似的元素。

在上例中,我们通过包含属性category并为每个元素分配不同的值来对植物进行分类。因此,我们有两个类别plants,一个flowers,另一个shrubs。因此,我们有两个具有不同属性的plant元素。

您还可以观察到,我们在XML开头声明了此属性。

属性类型

下表列出了属性类型:

属性类型 描述
StringType 它接受任何文字字符串作为值。CDATA是StringType。CDATA是字符数据。这意味着,任何非标记字符的字符串都是属性的合法部分。
TokenizedType

这是一个更受限制的类型。在属性值被规范化后,将应用语法中提到的有效性约束。TokenizedType属性如下:

  • ID - 用于将元素指定为唯一。

  • IDREF - 用于引用已为另一个元素命名的ID。

  • IDREFS - 用于引用元素的所有ID。

  • ENTITY - 指示属性将表示文档中的外部实体。

  • ENTITIES - 指示属性将表示文档中的外部实体。

  • NMTOKEN - 与CDATA类似,但对属性中可以包含哪些数据有限制。

  • NMTOKENS - 与CDATA类似,但对属性中可以包含哪些数据有限制。

EnumeratedType

在其声明中有一组预定义的值。从中,它必须分配一个值。有两种枚举属性:

  • NotationType - 声明元素将被引用到XML文档其他地方声明的NOTATION。

  • Enumeration - 枚举允许您定义属性值必须匹配的特定值列表。

元素属性规则

以下是属性需要遵循的规则:

  • 属性名称在同一个开始标签或空元素标签中不能出现多次。

  • 必须使用属性列表声明在文档类型定义 (DTD) 中声明属性。

  • 属性值不能包含对外部实体的直接或间接实体引用。

  • 属性值中直接或间接引用的任何实体的替换文本不能包含小于号 (<)

XML - 注释

本章解释了XML注释在XML文档中的工作原理。XML注释类似于HTML注释。注释作为笔记或行添加,以了解XML代码的目的。

注释可用于包含相关链接、信息和术语。它们仅在源代码中可见;不在XML代码中。注释可以出现在XML代码中的任何位置。

语法

XML注释具有以下语法:

<!--Your comment-->

注释以<!--开头,以-->结尾。您可以在字符之间添加文本注释作为注释。您不能将一个注释嵌套在另一个注释内。

示例

以下示例演示了在XML文档中使用注释:

<?xml version = "1.0" encoding = "UTF-8" ?>
<!--Students grades are uploaded by months-->
<class_list>
   <student>
      <name>Tanmay</name>
      <grade>A</grade>
   </student>
</class_list>

<!---->字符之间的任何文本都被视为注释。

XML注释规则

XML注释应遵循以下规则:

  • 注释不能出现在XML声明之前。
  • 注释可以出现在文档中的任何位置。
  • 注释不能出现在属性值中。
  • 注释不能嵌套在其他注释内。

XML - 字符实体

本章描述了XML字符实体。在了解字符实体之前,让我们首先了解什么是XML实体。

正如W3 Consortium所述,实体的定义如下:

“文档实体作为实体树的根和XML处理器的起点”。

这意味着,实体是XML中的占位符。这些可以在文档序言或DTD中声明。有不同类型的实体,本章将讨论字符实体。

HTML和XML都有一些保留用于其自身的符号,这些符号不能用作XML代码中的内容。例如,<>符号用于打开和关闭XML标签。要显示这些特殊字符,可以使用字符实体。

有一些特殊字符或符号无法直接从键盘输入。字符实体也可以用于显示这些符号/特殊字符。

字符实体类型

有三种类型的字符实体:

  • 预定义字符实体
  • 编号字符实体
  • 命名字符实体

预定义字符实体

引入它们是为了避免使用某些符号时出现的歧义。例如,当小于 (<) 或大于 (>) 符号与角标签 (<>) 一起使用时,会观察到歧义。字符实体基本上用于分隔XML中的标签。以下是XML规范中预定义字符实体的列表。这些可以用来表达字符而不会产生歧义。

  • 与号 - &amp;

  • 单引号 - &apos;

  • 大于 - &gt;

  • 小于 - &lt;

  • 双引号 - &quot;

数字字符实体

数字引用用于引用字符实体。数字引用可以是十进制或十六进制格式。由于有数千个可用的数字引用,这些引用有点难以记住。数字引用通过其在Unicode字符集中的编号来引用字符。

十进制数字引用的通用语法为:

&# decimal number ;

十六进制数字引用的通用语法为:

&#x Hexadecimal number ;

下表列出了一些预定义的字符实体及其数值:

实体名称 字符 十进制引用 十六进制引用
quot " &#34; &#x22;
amp & &#38; &#x26;
apos ' &#39; &#x27;
lt < &#60; &#x3C;
gt > &#62; &#x3E;

命名字符实体

由于难以记住数字字符,因此最常用的字符实体类型是命名字符实体。在这里,每个实体都用一个名称标识。

例如:

  • 'Aacute' 代表带有重音符的大写 字符。

  • 'ugrave' 代表带有重音符的小写

XML - CDATA 节

本章将讨论XML CDATA 部分。CDATA表示字符数据。CDATA定义为不被解析器解析的文本块,但会被识别为标记。

预定义实体,如&lt;、&gt;&amp;,需要输入,并且通常难以在标记中阅读。在这种情况下,可以使用CDATA部分。通过使用CDATA部分,您可以命令解析器文档的特定部分不包含标记,应将其视为常规文本。

语法

以下是CDATA部分的语法:

<![CDATA[
   characters with markup
]]>

上述语法由三个部分组成:

  • CDATA 开始部分 - CDATA 以九个字符的分隔符<![CDATA[开头

  • CDATA 结束部分 - CDATA 部分以]]>分隔符结尾。

  • CDATA 部分 - 这两个括号之间的字符被解释为字符,而不是标记。此部分可能包含标记字符 (<、> 和 &),但XML处理器会忽略它们。

示例

以下标记代码显示了CDATA的示例。这里,CDATA部分中编写的每个字符都被解析器忽略。

<script>
   <![CDATA[
      <message> Welcome to TutorialsPoint </message>
   ]] >
</script >

在上文的语法中,`` 和 `` 之间的所有内容都被视为字符数据,而不是标记。

CDATA 规则

对于 XML CDATA,必须遵循以下规则:

  • CDATA 在 XML 文档中的任何位置都不能包含字符串“]]>”。
  • CDATA 区段不允许嵌套。

XML - 空格

本章将讨论 XML 文档中的空格处理。空格是空格、制表符和换行符的集合。它们通常用于使文档更易于阅读。

XML 文档包含两种类型的空格——有效空格和无效空格。下面将通过示例对两者进行解释。

有效空格

有效空格出现在包含文本和标记同时存在的元素中。例如:

<name>TanmayPatil</name>

<name>Tanmay Patil</name>

由于TanmayPatil 之间的空格,以上两个元素有所不同。读取 XML 文件中此元素的任何程序都必须保持这种区别。

无效空格

无效空格是指只允许元素内容的空格。例如:

<address.category = "residence">
<address....category = "..residence">

以上示例相同。此处,空格由点 (.) 表示。在上例中,`address` 和 `category` 之间的空格是无效的。

可以为元素附加一个名为xml:space 的特殊属性。这表示应用程序不应删除该元素的空格。可以将此属性设置为defaultpreserve,如下例所示:

<!ATTLIST address  xml:space (default|preserve) 'preserve'>

其中:

  • default 表示应用程序的默认空格处理模式对于此元素是可以接受的。

  • preserve 表示应用程序应保留所有空格。

XML - 处理

本章介绍处理指令 (PI)。根据 XML 1.0 建议的定义:

“处理指令 (PI) 允许文档包含应用程序的指令。PI 不是文档字符数据的一部分,但必须传递给应用程序。”

处理指令 (PI) 可用于将信息传递给应用程序。PI 可以出现在文档中标记之外的任何位置。它们可以出现在序言中(包括文档类型定义 (DTD))、文本内容中或文档之后。

语法

以下是 PI 的语法:

<?target instructions?>

其中

  • target - 指明指令的目标应用程序。

  • instruction - 描述应用程序要处理的信息的字符。

PI 以特殊标记<? 开头,以?> 结尾。字符串?> 出现后,内容处理立即结束。

示例

PI 很少使用。它们主要用于将 XML 文档链接到样式表。以下是一个示例:

<?xml-stylesheet href = "tutorialspointstyle.css" type = "text/css"?>

此处,targetxml-stylesheethref="tutorialspointstyle.css"type="text/css"datainstructions,目标应用程序将在处理给定的 XML 文档时使用这些数据或指令。

在这种情况下,浏览器通过指示应在显示之前转换 XML 来识别目标;第一个属性声明转换的类型为 XSL,第二个属性指向其位置。

处理指令规则

PI 可以包含任何数据,但?> 组合除外,该组合被解释为结束分隔符。以下是两个有效 PI 的示例:

<?welcome to pg = 10 of tutorials point?>

<?welcome?>

XML - 编码

编码是将 Unicode 字符转换为其等效二进制表示的过程。当 XML 处理器读取 XML 文档时,它会根据编码类型对文档进行编码。因此,我们需要在 XML 声明中指定编码类型。

编码类型

主要有两种编码类型:

  • UTF-8
  • UTF-16

UTF 代表UCS 变换格式,UCS 本身代表通用字符集。8 或 16 指的是表示字符所用的位数。它们是 8 位(1 到 4 个字节)或 16 位(2 或 4 个字节)。对于没有编码信息的文档,默认情况下设置为 UTF-8。

语法

编码类型包含在 XML 文档的序言部分中。UTF-8 编码的语法如下:

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

UTF-16 编码的语法如下:

<?xml version = "1.0" encoding = "UTF-16" standalone = "no" ?>

示例

以下示例显示了编码的声明:

<?xml version = "1.0" encoding = "UTF-8" standalone = "no" ?>
<contact-info>
   <name>Tanmay Patil</name>
   <company>TutorialsPoint</company>
   <phone>(011) 123-4567</phone>
</contact-info>

在上例中,encoding="UTF-8" 指定使用 8 位来表示字符。要表示 16 位字符,可以使用UTF-16 编码。

使用 UTF-8 编码的 XML 文件的大小往往小于使用 UTF-16 格式编码的文件。

XML - 验证

验证是一个验证 XML 文档的过程。如果 XML 文档的内容与元素、属性和相关的文档类型声明 (DTD) 匹配,并且文档符合其中表达的约束,则该文档被称为有效。XML 解析器通过两种方式处理验证。它们是:

  • 格式良好的 XML 文档
  • 有效的 XML 文档

格式良好的 XML 文档

如果 XML 文档符合以下规则,则称其为格式良好

  • 非 DTD XML 文件必须使用预定义的字符实体来表示amp(&)apos(单引号)gt(>)lt(<)quot(双引号)

  • 它必须遵循标记的顺序,即必须在关闭外部标记之前关闭内部标记。

  • 它的每个开始标记都必须有一个结束标记,或者它必须是一个自结束标记。(``....`` 或 ``)。</p></li> <li><p>它在一个开始标记中只能有一个属性,该属性需要用引号括起来。</p></li> <li><p>必须声明除<b>amp(&)</b>、<b>apos(单引号)</b>、<b>gt(>)</b>、<b>lt(<)</b>、<b>quot(双引号)</b> 以外的其他实体。</p></li> </ul> <h3>示例</h3> <p>以下是一个格式良好的 XML 文档示例:</p> <pre class="prettyprint notranslate"><?xml version = "1.0" encoding = "UTF-8" standalone = "yes" ?> <!DOCTYPE address [ <!ELEMENT address (name,company,phone)> <!ELEMENT name (#PCDATA)> <!ELEMENT company (#PCDATA)> <!ELEMENT phone (#PCDATA)> ]> <address> <name>Tanmay Patil</name> <company>TutorialsPoint</company> <phone>(011) 123-4567</phone> </address> </pre> <p>以上示例被称为格式良好,因为:</p> <ul class="list"> <li><p>它定义了文档的类型。此处,文档类型为<b>element</b> 类型。</p></li> <li><p>它包含一个名为<b>address</b> 的根元素。</p></li> <li><p>name、company 和 phone 之间的每个子元素都包含在其自解释标记中。</p></li> <li><p>保持标记的顺序。</p></li> </ul> <h2>有效的 XML 文档</h2> <p>如果 XML 文档格式良好且具有关联的文档类型声明 (DTD),则称其为有效的 XML 文档。我们将在章节<a href="/xml/xml_dtds.htm">XML - DTDs</a>中详细学习 DTD。</p> <h1>XML - DTDs</h1> <p>XML 文档类型声明,通常称为 DTD,是一种精确描述 XML 语言的方法。DTD 根据相应 XML 语言的语法规则检查 XML 文档的词汇和结构的有效性。</p> <p>XML DTD 可以指定在文档内,也可以保存在单独的文档中,然后单独链接。</p> <h2>语法</h2> <p>DTD 的基本语法如下:</p> <pre class="prettyprint notranslate"><!DOCTYPE element DTD identifier [ declaration1 declaration2 ........ ]> </pre> <p>在上文的语法中:</p> <ul class="list"> <li><p><b>DTD</b> 以`<!DOCTYPE` 分隔符开头。</p></li> <li><p><b>element</b> 告诉解析器从指定的根元素解析文档。</p></li> <li><p><b>DTD 标识符</b>是文档类型定义的标识符,它可能是系统上文件的路径或互联网上文件的 URL。如果 DTD 指向外部路径,则称为<b>外部子集</b>。</p></li> <li><p><b>方括号 [ ]</b> 包含一个可选的实体声明列表,称为<i>内部子集</i>。</p></li> </ul> <h2>内部 DTD</h2> <p>如果在 XML 文件中声明元素,则 DTD 称为内部 DTD。要将其称为内部 DTD,XML 声明中的`standalone` 属性必须设置为<b>yes</b>。这意味着声明独立于外部源工作。</p> <h3>语法</h3> <p>以下是内部 DTD 的语法:</p> <pre class="result notranslate"><!DOCTYPE root-element [element-declarations]> </pre> <p>其中<i>root-element</i> 是根元素的名称,<i>element-declarations</i> 是声明元素的地方。</p> <h3>示例</h3> <p>以下是一个内部 DTD 的简单示例:</p> <pre class="prettyprint notranslate"><?xml version = "1.0" encoding = "UTF-8" standalone = "yes" ?> <!DOCTYPE address [ <!ELEMENT address (name,company,phone)> <!ELEMENT name (#PCDATA)> <!ELEMENT company (#PCDATA)> <!ELEMENT phone (#PCDATA)> ]> <address> <name>Tanmay Patil</name> <company>TutorialsPoint</company> <phone>(011) 123-4567</phone> </address> </pre> <p>让我们来看一下上面的代码:</p> <p><b>开始声明</b>- 使用以下语句开始 XML 声明。</p> <pre class="result notranslate"><?xml version = "1.0" encoding = "UTF-8" standalone = "yes" ?> </pre> <p><b>DTD</b> - 在 XML 头之后,紧跟着<i>文档类型声明</i>,通常称为 DOCTYPE -</p> <pre class="result notranslate"><!DOCTYPE address [ </pre> <p>DOCTYPE 声明的元素名称开头有一个感叹号 (!) 。DOCTYPE 通知解析器此 XML 文档与 DTD 相关联。</p> <p><b>DTD 主体</b> - DOCTYPE 声明之后是 DTD 的主体,您可以在其中声明元素、属性、实体和符号。</p> <pre class="prettyprint notranslate"><!ELEMENT address (name,company,phone)> <!ELEMENT name (#PCDATA)> <!ELEMENT company (#PCDATA)> <!ELEMENT phone_no (#PCDATA)> </pre> <p>此处声明了几个构成`<name>` 文档词汇表的元素。`<!ELEMENT name (#PCDATA)>` 将元素<i>name</i> 定义为“#PCDATA”类型。此处 #PCDATA 表示可解析的文本数据。</p> <p><b>结束声明</b> - 最后,使用右括号和右尖括号 (<b>]></b>) 关闭 DTD 的声明部分。这有效地结束了定义,此后,XML 文档紧随其后。</p> <h3>规则</h3> <ul class="list"> <li><p>文档类型声明必须出现在文档的开头(仅在 XML 头之前)——不允许出现在文档中的其他任何位置。</p></li> <li><p>与 DOCTYPE 声明类似,元素声明必须以感叹号开头。</p></li> <li><p>文档类型声明中的名称必须与根元素的元素类型匹配。</p></li> </ul> <h2>外部 DTD</h2> <p>在外部 DTD 中,元素在 XML 文件之外声明。通过指定系统属性来访问它们,系统属性可以是合法的<i>.dtd</i> 文件或有效的 URL。要将其称为外部 DTD,XML 声明中的`standalone` 属性必须设置为<b>no</b>。这意味着声明包含来自外部源的信息。</p> <h3>语法</h3> <p>以下是外部 DTD 的语法:</p> <pre class="result notranslate"><!DOCTYPE root-element SYSTEM "file-name"> </pre> <p>其中<i>file-name</i> 是具有<i>.dtd</i> 扩展名的文件。</p> <h3>示例</h3> <p>以下示例显示了外部 DTD 的用法:</p> <pre class="prettyprint notranslate"><?xml version = "1.0" encoding = "UTF-8" standalone = "no" ?> <!DOCTYPE address SYSTEM "address.dtd"> <address> <name>Tanmay Patil</name> <company>TutorialsPoint</company> <phone>(011) 123-4567</phone> </address> </pre> <p>DTD 文件<b>address.dtd</b> 的内容如下所示:</p> <pre class="prettyprint notranslate"><!ELEMENT address (name,company,phone)> <!ELEMENT name (#PCDATA)> <!ELEMENT company (#PCDATA)> <!ELEMENT phone (#PCDATA)> </pre> <h2>类型</h2> <p>您可以使用<b>系统标识符</b>或<b>公共标识符</b>引用外部 DTD。</p> <h3>系统标识符</h3> <p>系统标识符使您可以指定包含 DTD 声明的外部文件的位置。语法如下:</p> <pre class="result notranslate"><!DOCTYPE name SYSTEM "address.dtd" [...]> </pre> <p>如您所见,它包含关键字 SYSTEM 和指向文档位置的 URI 引用。</p> <h3>公共标识符</h3> <p>公共标识符提供了一种查找 DTD 资源的机制,其写法如下:</p> <pre class="result notranslate"><!DOCTYPE name PUBLIC "-//Beginning XML//DTD Address Example//EN"> </pre> <p>如你所见,它以关键字 PUBLIC 开头,后面跟着一个特殊的标识符。公共标识符用于识别目录中的条目。公共标识符可以遵循任何格式,但是,一种常用的格式称为<b>正式公共标识符 (Formal Public Identifiers, 或 FPI)</b>。</p> <h1>XML - 模式</h1> <p>XML Schema 通常被称为<b>XML 模式定义 (XML Schema Definition, XSD)</b>。它用于描述和验证 XML 数据的结构和内容。XML 模式定义元素、属性和数据类型。模式元素支持命名空间。它类似于描述数据库中数据的数据库模式。</p> <h2>语法</h2> <p>您需要在 XML 文档中声明一个模式,如下所示:</p> <h3>示例</h3> <p>以下示例显示了如何使用模式:</p> <pre class="prettyprint notranslate"><?xml version = "1.0" encoding = "UTF-8"?> <xs:schema xmlns:xs = "http://www.w3.org/2001/XMLSchema"> <xs:element name = "contact"> <xs:complexType> <xs:sequence> <xs:element name = "name" type = "xs:string" /> <xs:element name = "company" type = "xs:string" /> <xs:element name = "phone" type = "xs:int" /> </xs:sequence> </xs:complexType> </xs:element> </xs:schema> </pre> <p>XML 模式背后的基本思想是它们描述了 XML 文档可以采用的合法格式。</p> <h2>元素</h2> <p>正如我们在<a href="/xml/xml_elements.htm">XML - 元素</a>章节中看到的,元素是 XML 文档的构建块。元素可以在 XSD 中定义如下:</p> <pre class="prettyprint notranslate"><xs:element name = "x" type = "y"/> </pre> <h2>定义类型</h2> <p>您可以通过以下方式定义 XML 模式元素:</p> <h3>简单类型</h3> <p>简单类型元素仅在文本上下文中使用。一些预定义的简单类型包括:xs:integer、xs:boolean、xs:string、xs:date。例如:</p> <pre class="prettyprint notranslate"><xs:element name = "phone_number" type = "xs:int" /> </pre> <h3>复杂类型</h3> <p>复杂类型是其他元素定义的容器。这允许您指定元素可以包含哪些子元素,并在 XML 文档中提供一些结构。例如:</p> <pre class="prettyprint notranslate"><xs:element name = "Address"> <xs:complexType> <xs:sequence> <xs:element name = "name" type = "xs:string" /> <xs:element name = "company" type = "xs:string" /> <xs:element name = "phone" type = "xs:int" /> </xs:sequence> </xs:complexType> </xs:element> </pre> <p>在上面的例子中,<i>Address</i> 元素包含子元素。这是一个用于其他<b><xs:element></b>定义的容器,允许在 XML 文档中构建简单的元素层次结构。</p> <h3>全局类型</h3> <p>使用全局类型,您可以在文档中定义单个类型,所有其他引用都可以使用该类型。例如,假设您想为公司的不同地址概括<i>person</i>和<i>company</i>。在这种情况下,您可以定义一个通用类型,如下所示:</p> <pre class="prettyprint notranslate"><xs:element name = "AddressType"> <xs:complexType> <xs:sequence> <xs:element name = "name" type = "xs:string" /> <xs:element name = "company" type = "xs:string" /> </xs:sequence> </xs:complexType> </xs:element> </pre> <p>现在让我们在我们的示例中使用此类型,如下所示:</p> <pre class="prettyprint notranslate"><xs:element name = "Address1"> <xs:complexType> <xs:sequence> <xs:element name = "address" type = "AddressType" /> <xs:element name = "phone1" type = "xs:int" /> </xs:sequence> </xs:complexType> </xs:element> <xs:element name = "Address2"> <xs:complexType> <xs:sequence> <xs:element name = "address" type = "AddressType" /> <xs:element name = "phone2" type = "xs:int" /> </xs:sequence> </xs:complexType> </xs:element> </pre> <p>无需两次定义名称和公司(一次用于<i>Address1</i>,一次用于<i>Address2</i>),我们现在只有一个定义。这使得维护更简单,即,如果您决定向地址添加“邮政编码”元素,您只需要在一个地方添加它们。</p> <h2>属性</h2> <p>XSD 中的属性在元素内提供额外信息。属性具有如下所示的<i>name</i>和<i>type</i>属性:</p> <pre class="prettyprint notranslate"><xs:attribute name = "x" type = "y"/> </pre> <h1>XML - 树状结构</h1> <p>XML 文档始终具有描述性。树状结构通常被称为<b>XML 树</b>,它在轻松描述任何 XML 文档方面起着重要作用。</p> <p>树状结构包含根(父)元素、子元素等等。通过使用树状结构,您可以从根开始了解所有后续分支和子分支。解析从根开始,然后向下移动到第一个分支的元素,从那里取第一个分支,依此类推,直到叶子节点。</p> <h2>示例</h2> <p>以下示例演示了简单的 XML 树结构:</p> <pre class="prettyprint notranslate"><?xml version = "1.0"?> <Company> <Employee> <FirstName>Tanmay</FirstName> <LastName>Patil</LastName> <ContactNo>1234567890</ContactNo> <Email>tanmaypatil@xyz.com</Email> <Address> <City>Bangalore</City> <State>Karnataka</State> <Zip>560212</Zip> </Address> </Employee> </Company> </pre> <p>以下树结构表示上述 XML 文档:</p> <img src="/xml/images/tree_structure.jpg" alt="XML Trees Structure"> <p>在上图中,有一个名为<company>的根元素。在里面,还有一个元素<Employee>。在 employee 元素内,有五个分支,名为<FirstName>、<LastName>、<ContactNo>、<Email>和<Address>。在<Address>元素内,有三个子分支,名为<City> <State>和<Zip>。</p> <h1>XML - DOM</h1> <p><b>文档对象模型 (Document Object Model, DOM)</b>是 XML 的基础。XML 文档具有称为<i>节点</i>的信息单元的层次结构;DOM 是一种描述这些节点及其之间关系的方法。</p> <p>DOM 文档是按层次结构组织的节点或信息片段的集合。这种层次结构允许开发人员遍历树来查找特定信息。由于它基于信息的层次结构,因此 DOM 被称为<i>基于树的</i>。</p> <p>另一方面,XML DOM 还提供了一个 API,允许开发人员在树中的任何点添加、编辑、移动或删除节点,以创建应用程序。</p> <h2>示例</h2> <p>以下示例 (sample.htm) 将 XML 文档 (“address.xml”) 解析为 XML DOM 对象,然后使用 JavaScript 从中提取一些信息:</p> <pre class="prettyprint notranslate"><!DOCTYPE html> <html> <body> <h1>TutorialsPoint DOM example </h1> <div> <b>Name:</b> <span id = "name"></span><br> <b>Company:</b> <span id = "company"></span><br> <b>Phone:</b> <span id = "phone"></span> </div> <script> if (window.XMLHttpRequest) {// code for IE7+, Firefox, Chrome, Opera, Safari xmlhttp = new XMLHttpRequest(); } else {// code for IE6, IE5 xmlhttp = new ActiveXObject("Microsoft.XMLHTTP"); } xmlhttp.open("GET","/xml/address.xml",false); xmlhttp.send(); xmlDoc = xmlhttp.responseXML; document.getElementById("name").innerHTML= xmlDoc.getElementsByTagName("name")[0].childNodes[0].nodeValue; document.getElementById("company").innerHTML= xmlDoc.getElementsByTagName("company")[0].childNodes[0].nodeValue; document.getElementById("phone").innerHTML= xmlDoc.getElementsByTagName("phone")[0].childNodes[0].nodeValue; </script> </body> </html> </pre> <p><b>address.xml</b>的内容如下:</p> <pre class="prettyprint notranslate"><?xml version = "1.0"?> <contact-info> <name>Tanmay Patil</name> <company>TutorialsPoint</company> <phone>(011) 123-4567</phone> </contact-info> </pre> <p>现在让我们将这两个文件<b>sample.htm</b>和<b>address.xml</b>放在同一个目录<b>/xml</b>中,并通过在任何浏览器中打开它来执行<b>sample.htm</b>文件。这应该产生以下输出。</p> <img src="/xml/images/xml_dom_example.png" alt="XML DOM Output"> <p>在这里,您可以看到如何提取每个子节点以显示其值。</p> <h1>XML - 命名空间</h1> <p><b>命名空间</b>是一组唯一的名称。命名空间是一种机制,通过它可以将元素和属性名称分配给一个组。命名空间由 URI(统一资源标识符)标识。</p> <h2>命名空间声明</h2> <p>命名空间使用保留属性声明。这样的属性名称必须是<b>xmlns</b>或以<b>xmlns:</b>开头,如下所示:</p> <pre class="result notranslate"><element xmlns:name = "URL"> </pre> <h2>语法</h2> <ul class="list"> <li><p>命名空间以关键字<b>xmlns</b>开头。</p></li> <li><p>单词<b>name</b>是命名空间前缀。</p></li> <li><p><b>URL</b>是命名空间标识符。</p></li> </ul> <h2>示例</h2> <p>命名空间只影响文档中的有限区域。包含声明的元素及其所有后代都在命名空间的范围内。以下是一个简单的 XML 命名空间示例:</p> <pre class="prettyprint notranslate"><?xml version = "1.0" encoding = "UTF-8"?> <cont:contact xmlns:cont = "www.tutorialspoint.com/profile"> <cont:name>Tanmay Patil</cont:name> <cont:company>TutorialsPoint</cont:company> <cont:phone>(011) 123-4567</cont:phone> </cont:contact> </pre> <p>这里,命名空间前缀是<b>cont</b>,命名空间标识符 (URI) 为<i>www.tutorialspoint.com/profile</i>。这意味着,带有<b>cont</b>前缀的元素名称和属性名称(包括 contact 元素),都属于<i>www.tutorialspoint.com/profile</i>命名空间。</p> <h1>XML - 数据库</h1> <p><b>XML 数据库</b>用于以 XML 格式存储大量信息。随着 XML 在各个领域的应用越来越广泛,需要一个安全的地方来存储 XML 文档。数据库中存储的数据可以使用<b>XQuery</b>查询、序列化并导出为所需的格式。</p> <h2>XML 数据库类型</h2> <p>XML 数据库主要有两种类型:</p> <ul class="list"> <li>支持 XML 的</li> <li>原生 XML (NXD)</li> </ul> <h2>支持 XML 的数据库</h2> <p>支持 XML 的数据库只不过是为转换 XML 文档而提供的扩展。这是一个关系数据库,其中数据存储在由行和列组成的表中。表包含一组记录,这些记录又包含字段。</p> <h3>原生 XML 数据库</h3> <p>原生 XML 数据库基于容器而不是表格式。它可以存储大量的 XML 文档和数据。原生 XML 数据库由<b>XPath</b>表达式查询。</p> <p>原生 XML 数据库优于支持 XML 的数据库。与支持 XML 的数据库相比,它在存储、查询和维护 XML 文档方面具有更高的能力。</p> <h3>示例</h3> <p>以下示例演示了 XML 数据库:</p> <pre class="prettyprint notranslate"><?xml version = "1.0"?> <contact-info> <contact1> <name>Tanmay Patil</name> <company>TutorialsPoint</company> <phone>(011) 123-4567</phone> </contact1> <contact2> <name>Manisha Patil</name> <company>TutorialsPoint</company> <phone>(011) 789-4567</phone> </contact2> </contact-info> </pre> <p>在这里,创建了一个联系人表,其中包含联系人的记录(contact1 和 contact2),这些记录又包含三个实体:<i>name、company</i>和<i>phone</i>。</p> <h1>XML - 查看器</h1> <p>本章介绍了<b>查看 XML 文档的各种方法</b>。可以使用简单的文本编辑器或任何浏览器来查看 XML 文档。大多数主要的浏览器都支持 XML。可以通过双击 XML 文档(如果它是本地文件)或在地址栏中键入 URL 路径(如果文件位于服务器上)在浏览器中打开 XML 文件,就像我们在浏览器中打开其他文件一样。XML 文件以<b>“.xml”</b>扩展名保存。</p> <p>让我们探索可以查看 XML 文件的各种方法。以下示例 (sample.xml) 用于查看本章的所有部分。</p> <pre class="prettyprint notranslate"><?xml version = "1.0"?> <contact-info> <name>Tanmay Patil</name> <company>TutorialsPoint</company> <phone>(011) 123-4567</phone> </contact-info> </pre> <h2>文本编辑器</h2> <p>任何简单的文本编辑器,如记事本、TextPad 或 TextEdit,都可以用来创建或查看 XML 文档,如下所示:</p> <img src="/xml/images/xml_viewer_notepad.jpg" alt="View XML In Notepad"> <h2>Firefox 浏览器</h2> <p>通过双击文件在 Chrome 中打开上述 XML 代码。XML 代码以彩色显示编码,使代码更易于阅读。它在 XML 元素左侧显示加号 (+) 或减号 (-)。当我们单击减号 (-) 时,代码会隐藏。当我们单击加号 (+) 时,代码行会展开。Firefox 中的输出如下所示:</p> <img src="/xml/images/xml_viewer_firefox.png" alt="View XML In Firefox"> <h2>Chrome 浏览器</h2> <p>在 Chrome 浏览器中打开上述 XML 代码。代码显示如下:</p> <img src="/xml/images/xml_viewer_chrome.png" alt="View XML In Chrome"> <h2>XML 文档中的错误</h2> <p>如果您的 XML 代码缺少某些标记,则浏览器中会显示一条消息。让我们尝试在 Chrome 中打开以下 XML 文件:</p> <pre class="prettyprint notranslate"><?xml version = "1.0"?> <contact-info> <name>Tanmay Patil</name> <company>TutorialsPoint</company> <phone>(011) 123-4567</phone> </contact-info> </pre> <p>在上面的代码中,起始标记和结束标记不匹配(参考 contact_info 标记),因此浏览器会显示错误消息,如下所示:</p> <img src="/xml/images/xml_viewer_error.png" alt="View XML Error"> <h1>XML - 编辑器</h1> <p><b>XML 编辑器</b>是一种标记语言编辑器。可以使用现有的编辑器(例如记事本、WordPad 或任何类似的文本编辑器)来编辑或创建 XML 文档。您还可以在线或下载专业 XML 编辑器,它具有更强大的编辑功能,例如:</p> <ul class="list"> <li>它会自动关闭未关闭的标记。</li> <li>它严格检查语法。</li> <li>它以彩色突出显示 XML 语法,以提高可读性。</li> <li>它可以帮助您编写有效的 XML 代码。</li> <li>它提供针对 DTD 和模式的 XML 文档的自动验证。</li> </ul> <h2>开源 XML 编辑器</h2> <p>以下是一些开源 XML 编辑器:</p> <ul class="list"> <li><p><b>在线 XML 编辑器</b> - 这是一款轻量级的 XML 编辑器,您可以在线使用。</p></li> <li><p><a href="http://www.xerlin.org/" target="_blank" rel="nofollow">Xerlin</a> - Xerlin 是一个针对 Java 2 平台的开源 XML 编辑器,在 Apache 许可下发布。它是一个基于 Java 的 XML 建模应用程序,可以轻松创建和编辑 XML 文件。</p></li> <li><p><a href="https://sourceforge.net/projects/camprocessor/" target="_blank" rel="nofollow">CAM - 内容组装机制 (CAM - Content Assembly Mechanism)</a> - CAM XML 编辑器工具带有 Oracle 赞助的 XML+JSON+SQL Open-XDX。</p></li> </ul> <h1>XML - 解析器</h1> <p><b>XML 解析器</b>是一个软件库或包,它为客户端应用程序提供与 XML 文档交互的接口。它检查 XML 文档的格式是否正确,也可能验证 XML 文档。现代浏览器具有内置的 XML 解析器。</p> <p>下图显示了 XML 解析器如何与 XML 文档交互:</p> <img src="/xml/images/xml_parser.png" alt="XML Parser"> <p>解析器的目标是将 XML 转换为可读的代码。</p> <p>为了简化解析过程,有一些商业产品可以促进 XML 文档的分解并产生更可靠的结果。</p> <p>一些常用的解析器如下所示:</p> <ul class="list"> <li><p><b>MSXML (Microsoft Core XML Services)</b> - 这是 Microsoft 提供的一套标准 XML 工具,其中包括一个解析器。</p></li> <li><p><b>System.Xml.XmlDocument</b> - 此类是 .NET 库的一部分,其中包含许多与使用 XML 相关的不同类。</p></li> <li><p><b>Java 内置解析器</b> - Java 库有自己的解析器。该库的设计使得您可以用外部实现(例如 Apache 的 Xerces 或 Saxon)替换内置解析器。</p></li> <li><p><b>Saxon</b> - Saxon 提供用于解析、转换和查询 XML 的工具。</p></li> <li><p><b>Xerces</b> - Xerces 使用 Java 实现,由著名的开源 Apache 软件基金会开发。</p></li> </ul> <h1>XML - 处理器</h1> <p>当软件程序读取 XML 文档并相应地采取行动时,这称为<i>处理</i>XML。任何可以读取和处理 XML 文档的程序都称为<i>XML 处理器</i>。XML 处理器读取 XML 文件并将其转换为内存中的结构,程序的其余部分可以访问这些结构。</p> <p>最基本的 XML 处理器读取 XML 文档并将其转换为内部表示,供其他程序或子程序使用。这称为<i>解析器</i>,它是每个 XML 处理程序的重要组成部分。</p> <p>处理器涉及处理指令,这可以在<a href="/xml/xml_processing.htm">处理指令</a>章节中学习。</p> <h2>类型</h2> <p>XML 处理器分为<b>验证</b>型或<b>非验证</b>型,这取决于它们是否检查 XML 文档的有效性。发现有效性错误的处理器必须能够报告它,但可以继续进行正常的处理。</p> <p><b>一些验证解析器包括</b> − xml4c(IBM,C++编写),xml4j(IBM,Java编写),MSXML(微软,Java编写),TclXML(TCL),xmlproc(Python),XML::Parser(Perl),Java Project X(Sun,Java编写)。</p> <p><b>一些非验证解析器包括</b> − OpenXML(Java),Lark(Java),xp(Java),AElfred(Java),expat(C),XParse(JavaScript),xmllib(Python)。</p> <div class="library-page-bottom-nav "> <div class="button button--blue" id="print-page"> <svg fill="white" xmlns="http://www.w3.org/2000/svg" height="1em" viewBox="0 0 512 512"><path d="M112 160V64c0-8.8 7.2-16 16-16H357.5c4.2 0 8.3 1.7 11.3 4.7l26.5 26.5c3 3 4.7 7.1 4.7 11.3V160h48V90.5c0-17-6.7-33.3-18.7-45.3L402.7 18.7C390.7 6.7 374.5 0 357.5 0H128C92.7 0 64 28.7 64 64v96h48zm16 208H384v96H128V368zm-16-48c-17.7 0-32 14.3-32 32H48V256c0-8.8 7.2-16 16-16H448c8.8 0 16 7.2 16 16v96H432c0-17.7-14.3-32-32-32H112zm320 80h48c17.7 0 32-14.3 32-32V256c0-35.3-28.7-64-64-64H64c-35.3 0-64 28.7-64 64V368c0 17.7 14.3 32 32 32H80v80c0 17.7 14.3 32 32 32H400c17.7 0 32-14.3 32-32V400z"></path></svg>打印页面</div> <div class="flex-group"> <a href="/xml/xml_processors.htm"> <div class="button button--neutral"> <svg xmlns="http://www.w3.org/2000/svg" width="10" height="16" viewBox="0 0 10 16" fill="none"><path d="M1.03117 8.48836C0.64065 8.09783 0.64065 7.46467 1.03117 7.07414L7.39514 0.710183C7.78566 0.319658 8.41883 0.319658 8.80935 0.710183C9.19987 1.10071 9.19987 1.73387 8.80935 2.1244L3.15249 7.78125L8.80935 13.4381C9.19987 13.8286 9.19987 14.4618 8.80935 14.8523C8.41882 15.2428 7.78566 15.2428 7.39513 14.8523L1.03117 8.48836ZM3.12109 8.78125L1.73828 8.78125L1.73828 6.78125L3.12109 6.78125L3.12109 8.78125Z" fill="black"></path></svg> 上一页 </div> </a> <a href="/xml/xml_useful_resources.htm"> <div class="button ">下一页 <svg xmlns="http://www.w3.org/2000/svg" width="10" height="16" viewBox="0 0 10 16" fill="none"><path d="M8.87117 8.48836C9.26169 8.09783 9.26169 7.46467 8.87117 7.07414L2.50721 0.710183C2.11668 0.319658 1.48352 0.319658 1.09299 0.710183C0.70247 1.10071 0.70247 1.73387 1.09299 2.1244L6.74985 7.78125L1.093 13.4381C0.702471 13.8286 0.702471 14.4618 1.093 14.8523C1.48352 15.2428 2.11668 15.2428 2.50721 14.8523L8.87117 8.48836ZM6.78125 8.78125L8.16406 8.78125L8.16406 6.78125L6.78125 6.78125L6.78125 8.78125Z" fill="white"></path></svg> </div> </a></div> </div> <div class="bottom-library-ads mt" style="margin:5px;"> <div class="google-bottom-ads" id="google-bottom-ads" style="height:450px;"> <div>广告</div> <div> <div id="ezoic-pub-ad-placeholder-131"></div> <div id="ezoic-pub-ad-placeholder-135"></div> <script> ezstandalone.cmd.push(function() { var width = window.innerWidth; if( width <= 768 ){ ezstandalone.showAds(135); document.getElementById("ezoic-pub-ad-placeholder-131").remove(); document.getElementById("google-right-ads").remove(); }else{ ezstandalone.showAds(131); document.getElementById("ezoic-pub-ad-placeholder-135").remove(); } }); </script> </div> </div> </div> </div> <div> <div class="data-sticky" id="google-right-ads"> <div class="google-right-ad" style="margin: 0px auto !important;margin-top:5px;min-height:280px!important"> <div id="ezoic-pub-ad-placeholder-127"></div> <script> ezstandalone.cmd.push(function() { ezstandalone.showAds(127); }); </script> </div> <div class="google-right-ad" style="margin-top:16px;min-height:280px!important"> <div id="ezoic-pub-ad-placeholder-128"></div> <script> ezstandalone.cmd.push(function() { ezstandalone.showAds(128); }); </script> </div> <div class="google-right-ad" style="margin-top:16px;margin-bottom:15px;min-height:600px!important"> <div id="ezoic-pub-ad-placeholder-129"></div> <script> ezstandalone.cmd.push(function() { ezstandalone.showAds(129); }); </script> </div> </div> </div> </div> </div> </main> <footer class="footer bg-neutral-800"> <div class="container"> <div> <h5>TOP TUTORIALS</h5> <ul> <li><a href="/python/index.htm" title="Python Tutorial">Python Tutorial</a></li> <li><a href="/java/index.htm" title="Java Tutorial">Java Tutorial</a></li> <li><a href="/cplusplus/index.htm" title="C++ Tutorial">C++ Tutorial</a></li> <li><a href="/cprogramming/index.htm" title="C Programming Tutorial">C Programming Tutorial</a></li> <li><a href="/csharp/index.htm" title="C# Tutorial">C# Tutorial</a></li> <li><a href="/php/index.htm" title="PHP Tutorial">PHP Tutorial</a></li> <li><a href="/r/index.htm" title="R Tutorial">R Tutorial</a></li> <li><a href="/html/index.htm" title="HTML Tutorial">HTML Tutorial</a></li> <li><a href="/css/index.htm" title="CSS Tutorial">CSS Tutorial</a></li> <li><a href="/javascript/index.htm" title="JavaScript Tutorial">JavaScript Tutorial</a></li> <li><a href="/sql/index.htm" title="SQL Tutorial">SQL Tutorial</a></li> </ul> </div> <div> <h5>TRENDING TECHNOLOGIES</h5> <ul> <li><a href="/cloud_computing/index.htm" title="Cloud Computing Tutorial">Cloud Computing Tutorial</a></li> <li><a href="/amazon_web_services/index.htm" title="Amazon Web Services Tutorial">Amazon Web Services Tutorial</a></li> <li><a href="/microsoft_azure/index.htm" title="Microsoft Azure Tutorial">Microsoft Azure Tutorial</a></li> <li><a href="/git/index.htm" title="Git Tutorial">Git Tutorial</a></li> <li> <a href="/ethical_hacking/index.htm" title="Ethical Hacking Tutorial">Ethical Hacking Tutorial</a></li> <li><a href="/docker/index.htm" title="Docker Tutorial">Docker Tutorial</a></li> <li><a href="/kubernetes/index.htm" title="Kubernetes Tutorial">Kubernetes Tutorial</a></li> <li><a href="/data_structures_algorithms/index.htm" title="DSA Tutorial">DSA Tutorial</a></li> <li><a href="/spring_boot/index.htm" title="Spring Boot Tutorial">Spring Boot Tutorial</a></li> <li><a href="/sdlc/index.htm" title="SDLC Tutorial">SDLC Tutorial</a></li> <li><a href="/unix/index.htm" title="Unix Tutorial">Unix Tutorial</a></li> </ul> </div> <div> <h5>CERTIFICATIONS</h5> <ul> <li><a href="/certification/business-analytics-certification-2023/index.asp" title="Business Analytics Certification">Business Analytics Certification</a></li> <li><a href="/certification/java-prime-pack/index.asp" title="Java & Spring Boot Advanced Certification">Java & Spring Boot Advanced Certification</a></li> <li><a href="/certification/data-science-advanced-certification/index.asp" title="Data Science Advanced Certification">Data Science Advanced Certification</a></li> <li><a href="/certification/cloud-computing-and-devops-advanced-certification/index.asp" title="Cloud Computing And DevOps">Cloud Computing And DevOps</a></li> <li><a href="/certification/advanced-certification-in-business-analytics/index.asp" title="Advanced Certification In Business Analytics">Advanced Certification In Business Analytics</a></li> <li><a href="/certification/artificial-intelligence-and-machine-learning-certification/index.asp" title="Artificial Intelligence And Machine Learning">Artificial Intelligence And Machine Learning</a></li> <li><a href="/certification/devops-certification/index.asp" title="DevOps Certification">DevOps Certification</a></li> <li><a href="/certification/game-development-prime-pack/index.asp" title="Game Development Certification">Game Development Certification</a></li> <li><a href="/certification/frontend-developer-certification/index.asp" title="Front-End Developer Certification">Front-End Developer Certification</a></li> <li><a href="/certification/aws-prime-pack/index.asp" title="AWS Certification Training">AWS Certification Training</a></li> <li><a href="/certification/complete-python-prime-pack/index.asp" title="Python Programming Certification">Python Programming Certification</a></li> </ul> </div> <div> <h5>COMPILERS & EDITORS</h5> <ul> <li><a href="/online_java_compiler.php" title="Online Java Compiler">Online Java Compiler</a></li> <li><a href="/online_python_compiler.php" title="Online Python Compiler">Online Python Compiler</a></li> <li><a href="/execute_golang_online.php" title="Online Go Compiler">Online Go Compiler</a></li> <li><a href="/compile_c_online.php" title="Online C Compiler">Online C Compiler</a></li> <li><a href="/compile_cpp_online.php" title="Online C++ Compiler">Online C++ Compiler</a></li> <li><a href="/online_csharp_compiler.php" title="Online C# Compiler">Online C# Compiler</a></li> <li><a href="/execute_php_online.php" title="Online PHP Compiler">Online PHP Compiler</a></li> <li><a href="/execute_matlab_online.php" title="Online MATLAB Compiler">Online MATLAB Compiler</a></li> <li><a href="/execute_bash_online.php" title="Online Bash Compiler">Online Bash Compiler</a></li> <li><a href="/execute_sql_online.php" title="Online SQL Compiler">Online SQL Compiler</a></li> <li><a href="/online_html_editor.php" title="Online Html Editor">Online Html Editor</a></li> </ul> </div> </div> <ul class="footer__list container"> <li><a href="/about/index.htm" title="ABOUT US">ABOUT US</a> | </li> <li><a href="/about/about_team.htm" title="OUR TEAM">OUR TEAM</a> | </li> <li><a href="/about/about_careers.htm" title="CAREERS">CAREERS</a> | </li> <li><a href="/job_search.php" title="JOBS">JOBS</a> | </li> <li><a href="/about/contact_us.htm" title="CONTACT US">CONTACT US</a> | </li> <li><a href="/about/about_terms_of_use.htm" title="TERMS OF USE">TERMS OF USE</a> | </li> <li><a href="/about/about_privacy.htm" title="PRIVACY POLICY">PRIVACY POLICY</a> | </li> <li><a href="/about/return_refund_policy.htm" title="REFUND POLICY">REFUND POLICY</a> | </li> <li><a href="/about/about_cookies.htm" title="COOKIES POLICY">COOKIES POLICY</a> | </li> <li><a href="/about/faq.htm" title="FAQ'S">FAQ'S</a></li> </ul> <div class="footer__socials container"> <img class="footer__logo" src="https://tutorialspoint.com/static/images/logo-footer.svg" alt="tutorials point logo"> <div> <a rel="nofollow" target="_blank" href="https://www.facebook.com/tutorialspointindia" title="Follow us on Facebook"><i class="fab fa-2x fa-facebook"></i></a> <a target="_blank" href="https://twitter.com/tutorialspoint" rel="nofollow" title="Follow us on Twitter"><i class="fab fa-2x fa-x-twitter"></i></a> <a target="_blank" href="https://www.youtube.com/channel/UCVLbzhxVTiTLiVKeGV7WEBg" rel="nofollow" title="Follow us on Youtube"><i class="fab fa-2x fa-youtube"></i></a> <a target="_blank" href="https://www.linkedin.com/company/tutorialspoint/" rel="nofollow" title="Follow us on LinkedIn"><i class="fab fa-2x fa-linkedin"></i></a> <a target="_blank" href="https://www.instagram.com/tutorialspoint_/" rel="nofollow" title="Follow us on Instagram"><i class="fab fa-2x fa-instagram"></i></a> </div> <div class="flex-group"> <button class="button-reset"><a href="https://play.google.com/store/apps/details?id=com.tutorialspoint.onlineviewer" target="_blank" title="Download Android App" rel="nofollow"><img src="https://tutorialspoint.com/static/images/googleplay.svg" alt="Download Android App"></a></button> <button class="button-reset"><a href="https://itunes.apple.com/us/app/tutorials-point/id914891263?ls=1&mt=8" target="_blank" title="Download IOS App" rel="nofollow"><img src="https://tutorialspoint.com/static/images/appstore.svg" alt="Download IOS App"></a></button> </div> </div> <div class="footer__legal-wrapper"> <div class="footer__legal ff-nunito"> <p> </p><p class="">Tutorials Point is a leading Ed Tech company striving to provide the best learning material on technical and non-technical subjects.</p> <p></p> <p class="footer__copyright ">© Copyright 2024. All Rights Reserved.</p> </div> </div> </footer> <script src="/static/js/lib-script.js?v12.43"></script> <script src="https://127.0.0.1/gsi/client" async="" defer=""></script> <script> function addParagraphs(ind) { let techLinks =[["Python","JavaScript","Spring Boot","Java","Linux/Unix","C#","Data Science","MySQL","Artificial Intelligence","SQL"], ["https://tutorialspoint.com/certification/complete-python-prime-pack/index.asp?utm_source=tutorialspoint&utm_medium=python_tutorial_3p&utm_campaign=internal", "https://tutorialspoint.com/certification/javascript-prime-pack/index.asp?utm_source=tutorialspoint&utm_medium=javascript_tutorial_3p&utm_campaign=internal", "https://tutorialspoint.com/certification/ultimate-guide-to-java-and-spring-boot-for-2022/index.asp?utm_source=tutorialspoint&utm_medium=java_tutorial_3p&utm_campaign=internal", "https://tutorialspoint.com/certification/ultimate-guide-to-java-and-spring-boot-for-2022/index.asp?utm_source=tutorialspoint&utm_medium=spring_boot_tutorial_3p&utm_campaign=internal", "https://tutorialspoint.com/certification/linux-system-administrator-certification/index.asp?utm_source=tutorialspoint&utm_medium=unix_tutorial_3p&utm_campaign=internal", "https://tutorialspoint.com/certification/chash-and-net-prime-pack/index.asp?utm_source=tutorialspoint&utm_medium=csharp_tutorial_3p&utm_campaign=internal", "https://tutorialspoint.com/certification/data-science-prime-pack/index.asp?utm_source=tutorialspoint&utm_medium=data_science_tutorial_3p&utm_campaign=internal", "https://tutorialspoint.com/certification/mysql-technologies-pack/index.asp?utm_source=tutorialspoint&utm_medium=mysql_tutorial_3p&utm_campaign=internal", "https://tutorialspoint.com/certification/artificial-intelligence-and-machine-learning-certification/index.asp?utm_source=tutorialspoint&utm_medium=artificial_intelligence_tutorial_3p&utm_campaign=internal", "https://tutorialspoint.com/certification/mysql-technologies-pack/index.asp?utm_source=tutorialspoint&utm_medium=sql_tutorial_3p&utm_campaign=internal"]] var p2 = ''; if(ind>=0){ p2 = p2 + '<a style="text-decoration:none;" href="' + techLinks[1][ind] +'" target="_blank" ><p class="prmt_ad">Learn <strong>'+ techLinks[0][ind] + '</strong> in-depth with real-world projects through our <strong>' + techLinks[0][ind] + ' certification course</strong>. Enroll and become a certified expert to boost your career.</p></a>'; } else{ p2 = p2 + '<a href="https://tutorialspoint.com/latest/courses?utm_source=tutorialspoint&utm_medium=tutorials_3p&utm_campaign=internal" style="text-decoration:none;" target="_blank"><p class="prmt_ad">Explore our <strong>latest online courses</strong> and learn new skills at your own pace. Enroll and become a certified expert to boost your career.</p></a>'; } $(p2).insertBefore($('.tutorial-content h2').eq(2)); } $(document).ready(function() { var url= window.location.href.toLowerCase(); if(url.indexOf('python') > -1){ addParagraphs(0); } else if(url.indexOf('javascript') > -1){ addParagraphs(1); } else if(url.indexOf('spring_boot') > -1){ addParagraphs(2); } else if(url.indexOf('java') > -1){ addParagraphs(3); } else if((url.indexOf('unix') > -1)||(url.indexOf('linux') > -1)){ addParagraphs(4); } else if((url.indexOf('csharp') > -1)||(url.indexOf('chash') > -1)){ addParagraphs(5); } else if(url.indexOf('data_science') > -1){ addParagraphs(6); } else if(url.indexOf('mysql') > -1){ addParagraphs(7); } else if((url.indexOf('artificial_intelligence') > -1)||(url.indexOf('artificial-intelligence') > -1)){ addParagraphs(8); } else if(url.indexOf('sql') > -1){ addParagraphs(9); } else{ addParagraphs(-1); } }); </script> <script> if(getCookie('user_id') == '' || getCookie('user_id') == null){ window.onload = function() { initializeGoogleOneTap(); }; } </script> <script src="https://tutorialspoint.com/fontawesome/js/all.min.js?v2.9"></script> <script src="https://127.0.0.1/cmp.min.js" data-cfasync="false"></script> <script async="" src="/static/js/ezoic-ad-inserter.js?v4.2"></script> <script async="" src="https://127.0.0.1/gtag/js?id=G-EX9ZP4VY84"></script> <script> window.dataLayer = window.dataLayer || []; function gtag(){dataLayer.push(arguments);} gtag('js', new Date()); gtag('config', 'G-EX9ZP4VY84'); </script> <!-- New Facebook Pixel Code --> <script> !function(f,b,e,v,n,t,s) {if(f.fbq)return;n=f.fbq=function(){n.callMethod? n.callMethod.apply(n,arguments):n.queue.push(arguments)}; if(!f._fbq)f._fbq=n;n.push=n;n.loaded=!0;n.version='2.0'; n.queue=[];t=b.createElement(e);t.async=!0; t.src=v;s=b.getElementsByTagName(e)[0]; s.parentNode.insertBefore(t,s)}(window,document,'script', 'https://127.0.0.1/en_US/fbevents.js'); fbq('init', '854536859149047'); fbq('track', 'PageView'); </script> <!-- End facebook Pixel Code --> <footer style="margin: 2em 2em 4em; font-size: small; text-align: center;"> © <script>document.write(new Date().getFullYear() + ' ' + location.host)</script>. All rights reserved. </footer></body></html>