Xml 简明教程

XML - Quick Guide

XML - Overview

XML 代表 *E*xtensible *M*arkup *L*anguage。它是一种基于文本的标记语言,源自标准通用标记语言 (SGML)。

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

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

  1. XML is extensible − XML 允许您创建自己的自描述标签或语言,以适合您的应用程序。

  2. XML carries the data, does not present it − XML 允许您存储数据,而不管其如何呈现。

  3. XML is a public standard − XML 由万维网联盟 (W3C) 开发,并作为开放标准提供。

XML Usage

XML 用途的简短列表说明了一切:

  1. XML 可以作为幕后工作者简化大型网站中的 HTML 文档创建。

  2. XML 可用于交换组织和系统之间的信息。

  3. XML 可用于卸载和重新加载数据库。

  4. XML 可用于存储和整理数据,可以自定义数据处理需求。

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

  6. 几乎任何类型的数据都可以作为 XML 文档表示。

What is Markup?

XML 是一种标记语言,它为以人类可读和机器可读格式编码文档定义了一组规则。那么什么是标记语言呢?标记是添加到文档中的信息,通过识别各个部分及其相互关系,可以以某种方式增强其含义。更具体地说,标记语言是一组符号,可以放在文档文本中,以划分和标记文档的部分。

以下示例展示了当 XML 标记嵌入在文本片段中时的外观 −

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

此代码段包括标记符号,或标记,如 <message>…​</message> 和 <text>…​ </text>。标记 <message> 和 </message> 标记 XML 代码片段的开始和结束。标记 <text> 和 </text> 环绕文本 Hello, world!。

Is XML a Programming Language?

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

XML - Syntax

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

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

您会注意到以上示例中有两种信息 −

  1. Markup, like <contact-info>

  2. 文本或字符数据,Tutorials Point 和 (040) 123-4567。

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

syntaxrules

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

XML Declaration

XML 文档可以选择使用 XML 声明。它的撰写方式如下 −

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

其中版本为 XML 版本,编码指定文件中使用的字符编码。

Syntax Rules for XML Declaration

  1. XML 声明区分大小写,必须以下“ &lt;?xml&gt; ”开头,其中“ xml ”以小写撰写。

  2. 如果文档包含 XML 声明,则必须严格作为 XML 文档中的第一条声明。

  3. XML 声明必须严格作为 XML 文档中的第一条声明。

  4. HTTP 协议可以覆盖 XML 声明中设置的编码值。

Tags and Elements

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

<element>

Syntax Rules for Tags and Elements

Element Syntax − 每个 XML 元素都需要使用起始元素或结束元素关闭,如下所示 −

<element>....</element>

或在简单的情况下,只需这样 −

<element/>

Nesting of Elements − 一个 XML 元素可以包含多个 XML 元素作为其子元素,但子元素不能重叠。即,元素的结束标记必须和最近未匹配的起始标记同名。

以下示例显示了错误的嵌套标记 −

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

以下示例显示了正确的嵌套标记 −

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

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

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

以下示例显示了格式正确的 XML 文档 −

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

Case Sensitivity − XML 元素名称区分大小写。这意味着起始元素和结束元素的名称需要完全相同。

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

XML Attributes

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

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

此处 href 是属性名称, http://www.tutorialspoint.com/ 是属性值。

Syntax Rules for XML Attributes

  1. XML(与 HTML 不同)中的属性名称区分大小写。也就是说,HREF 和 href 被视为两个不同的 XML 属性。

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

<a b = "x" c = "y" b = "z">....</a>
  1. 属性名称在没有引号定义的情况下,而属性值必须始终以引号形式出现。以下示例展示了不正确的 XML 语法−

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

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

XML References

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

  1. Entity References -实体引用在起始和结束分隔符之间包含一个名称。例如, &amp; ,其中 amp 是名称。该名称引用了一段预定义的文本和/或标记。

  2. Character References -这些包含引用,如 &#65; ,其中包含一个井号 (“#”) 和一个数字。该数字始终引用字符的 Unicode 编码。在本例中,65 引用字母 “A”。

XML Text

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

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

XML 语法本身保留一些字符。因此,它们不能直接使用。要使用它们,应使用下面列出的替换实体−

Not Allowed Character

Replacement Entity

Character Description

<

<

less than

>

>

greater than

&

&

ampersand

'

'

apostrophe

"

"

quotation mark

XML - Documents

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

XML Document Example

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

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

下图说明了 XML 文档的各个部分。

xml document

Document Prolog Section

Document Prolog 位于文档顶部,在根元素之前。此部分包含 −

  1. XML declaration

  2. Document type declaration

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

Document Elements Section

Document Elements 是 XML 的构建模块。它们将文档划分成一系列部分,每部分都用于特定的目的。您可以将文档分成多个部分,以便以不同的方式呈现它们或供搜索引擎使用。这些元素可以是容器,其中包含文本和其他元素的组合。

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

XML - Declaration

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

Syntax

以下语法显示 XML 声明 -

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

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

Parameter

Parameter_value

Parameter_description

Version

1.0

指定所使用的 XML 标准版本。

Encoding

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 是使用的默认编码。

Standalone

yes or no

它会告知解析器该文档是否依赖于外部来源(例如外部文档类型定义 (DTD))中的信息来获取其内容。默认值设置为否。将其设置为是会告诉处理程序解析文档不需要外部声明。

Rules

XML 声明应遵循以下规则 -

  1. 如果 XML 声明出现在 XML 中,则它必须被置于 XML 文档的第一行。

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

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

  4. 名称始终为小写。

  5. 放置参数的顺序非常重要。正确的顺序是:版本、编码和独立。

  6. 可以使用单引号或双引号。

  7. XML 声明没有关闭标签,即 &lt;/?xml&gt;

XML Declaration Examples

以下是 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 - Tags

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

我们可以将 XML 标记大体分类如下 −

Start Tag

每个非空 XML 元素的起始处都标记有开始标记。以下是开始标记示例 −

<address>

End Tag

每个有开始标记的元素都应以结束标记结尾。以下是结束标记示例 −

</address>

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

Empty Tag

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

开始标记后立即跟着一个结束标记,如下所示 −

<hr></hr>

一个完整的空元素标记如下所示 −

<hr />

对于没有任何内容的任何元素,都可以使用空元素标记。

XML Tags Rules

以下是使用 XML 标记时需要遵循的规则 −

Rule 1

XML 标记区分大小写。下面的代码行是错误语法的示例 </Address>,因为两个标记存在字母大小写差异,在 XML 中被视为错误语法。

<address>This is wrong syntax</Address>

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

<address>This is correct syntax</address>

Rule 2

必须按适当的顺序关闭 XML 标记,即,在另一元素内打开的 XML 标记必须在外层元素关闭之前关闭。例如 −

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

XML - Elements

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

每个 XML 文档包含一个或多个元素,其范围由开始和结束标记(或对于空元素,由空元素标记)定界。

Syntax

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

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

其中,

  1. element-name 是元素的名称。名称大小写必须与开始和结束标记匹配。

  2. attribute1, attribute2 是用空白分隔的元素属性,一个属性定义了一个元素的性质,它将一个名称关联到一个值(一个字符字段)上。属性的写法如下:

name = "value"

名称后面紧跟一个 = 号和一对双引号(“ ”)或单引号(' ')引起来的字符串值。

Empty Element

一个空元素(没有内容的元素)拥有以下语法:

<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 Elements Rules

对于 XML 元素,必须遵守如下规则:

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

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

  3. 一个元素的开始和结束标签必须相同。

  4. 一个元素(一个容器),可以包含文本或元素,如上面示例所示。

XML - Attributes

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

Syntax

XML 属性具有以下语法 −

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

其中 attribute1 和 attribute2 具有以下形式 −

name = "value"

value 必须位于双引号 (“ ") 或单引号 (' ') 中。此处,attribute1 和 attribute2 是唯一的属性标签。

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

<?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>

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

在以上示例中,我们通过包括属性类别并将不同的值分配给每个元素来对植物进行分类。因此,我们有两个类别的植物,一类是花卉,另一类是灌木。因此,我们有两个带有不同属性的植物元素。

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

Attribute Types

下表列出了属性类型 −

Attribute Type

Description

StringType

它将任何文字字符串作为值。CDATA 是 StringType。CDATA 是字符数据。这意味着任何非标记字符的字符串都属于属性的合法部分。

TokenizedType

这是一种更受限的类型。语法中指出的有效性约束在属性值标准化之后应用。标记类型属性的表示如下 − ID − 用于将元素指定为唯一。 IDREF − 用于引用另一个元素已命名的 ID。 IDREFS − 用于引用元素的所有 ID。 ENTITY − 表示该属性将在文档中表示一个外部实体。 ENTITIES − 这种属性将在文档中表示外部实体。 NMTOKEN − 它类似于 CDATA,它对哪些数据可以成为属性的一部分有限制。 NMTOKENS − 它类似于 CDATA,它对哪些数据可以成为属性的一部分有限制。

EnumeratedType

它在声明中有一个预定义值的列表。必须从该列表中分配一个值。有两种类型的枚举属性 − NotationType − 声明元素将被引用到 XML 文档中其他位置声明的 NOTATION。 Enumeration − 枚举允许您定义属性值必须匹配的一个特定值列表。

Element Attribute Rules

以下是针对属性需要遵循的规则 −

  1. 属性名称不得在同一开始标签或空元素标签中出现多次。

  2. 必须使用 Attribute-List Declaration 在 Document Type Definition (DTD) 中声明属性。

  3. 属性值不得包含对外部实体的直接或间接实体引用。

  4. 在属性值中直接或间接引用的任何实体的替换文本都不得包含小于号 ( &lt; )

XML - Comments

本章介绍了 XML 文档中注释的工作方式。 XML comments 类似于 HTML 注释。注释以笔记或行的形式添加,以便理解 XML 代码的目的。

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

Syntax

XML 注释具有以下语法 -

<!--Your comment-->

注释以 <!-- 开始,以 -→ 结束。你可以在字符之间以注释的形式添加文本笔记。你不得将一个注释嵌套在另一个注释中。

Example

以下示例演示了在 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 Comments Rules

XML 注释应遵循以下规则 −

  1. 注释不可出现在 XML 声明前面。

  2. 注释可以出现在文档中的任何位置。

  3. 注释不可出现在属性值中。

  4. 注释不可嵌套在其他注释内。

XML - Character Entities

本章介绍 XML Character Entities 。在我们理解字符实体之前,让我们先理解什么是 XML 实体。

正如 W3 Consortium 所说,实体的定义如下 −

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

HTML 和 XML 都为它们的使用保留了一些符号,这些符号不能用作 XML 代码中的内容。例如, <> 符号用于打开和关闭 XML 标记。为了显示这些特殊字符,使用了字符实体。

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

Types of Character Entities

共有三种类型的字符实体 −

  1. Predefined Character Entities

  2. Numbered Character Entities

  3. Named Character Entities

Predefined Character Entities

引入它们是为了避免在使用某些符号时出现歧义。例如,当小于 ( < ) 或大于 ( > ) 符号与角度标记 ( <> ) 一起使用时,会观察到歧义。字符实体基本上用于在 XML 中定界标记。以下是 XML 规范中预定义字符实体的列表。这些字符可用于明确地表示字符。

  1. Ampersand − &

  2. Single quote − '

  3. Greater than − >

  4. Less than − <

  5. Double quote − "

Numeric Character Entities

数字引用用于引用字符实体。数字引用可以是十进制或十六进制格式。由于有成千上万个数字引用,因此它们有点难以记住。数字引用通过其在 Unicode 字符集中的数字引用字符。

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

&# decimal number ;

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

&#x Hexadecimal number ;

下表列出了一些带有数字值的预定义字符实体 −

Entity name

Character

Decimal reference

Hexadecimal reference

quot

"

"

"

amp

&

&

&

apos

'

'

'

lt

<

<

<

gt

>

>

>

Named Character Entity

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

例如 -

  1. 'Aacute' 表示带有重音符号的大写字符。

  2. 'ugrave' 表示带有重音符号的小写字符。

XML - CDATA Sections

在本章中,我们将讨论 XML CDATA section 。术语 CDATA 表示,字符数据,CDATA 定义为解析器不解析的文本块,但仍作为标记识别。

&amplt;, &ampgt;,&ampamp; 这样的预定义实体需要输入,并且在标记中通常很难阅读,在这种情况下,可以使用 CDATA 部分,通过使用 CDATA 部分,您可以命令解析器,文档的特定部分不包含标记,并且应视为普通文本。

Syntax

以下是 CDATA 部分的语法:

<![CDATA[
   characters with markup
]]>

上面语法由三部分组成:

  1. CDATA Start section - CDATA 以 9 个字符的分隔符 &lt;![CDATA[ 开始

  2. CDATA End section - CDATA 部分以 ]]&gt; 分隔符结尾。

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

Example

以下标记代码显示了一个 CDATA 示例,在该示例中,解析器会忽略在 CDATA 部分内写的每个字符。

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

在上面语法中,<message> 和 </message> 之间的所有内容都作为字符数据处理,而不是作为标记。

CDATA Rules

XML CDATA 必须遵守给定的规则:

  1. CDATA 不能在 XML 文档的任何位置包含字符串 “]]>”。

  2. CDATA 部分中不允许嵌套。

XML - WhiteSpaces

在本章中,我们将讨论 XML 文档中的 whitespace 处理。空白是一系列空格、制表符和换行符。它们通常用于使文档更容易阅读。

XML 文档包含两种类型的空白-有效空白和无效空白。两种空白的解释和示例如下。

Significant Whitespace

有效空白出现在包含文本和标记共同存在的元素中。例如 −

<name>TanmayPatil</name>

<name>Tanmay Patil</name>

上述两个元素不同,因为 TanmayPatil 之间有空格。在 XML 文件中读取此元素的任何程序都有义务保持区别。

Insignificant Whitespace

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

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

上述示例相同。此处,空格用点号 (.) 表示。在上一个示例中,address 和 category 之间的空格是无效的。

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

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

其中,

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

  2. preserve 值表示保留所有空格的应用程序。

XML - Processing

本章节介绍 Processing Instructions (PIs) 。按照 XML 1.0 建议书的定义,

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

Syntax

以下是 PI 的语法 −

<?target instructions?>

其中

  1. target − 识别指令的目标应用程序。

  2. instruction − 描述要处理应用程序信息的字符。

PI 以特殊标记 <? 开头,以 ?> 结尾。在遇到字符串 ?> 后,内容的处理将立即结束。

Example

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

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

此处,目标是 xml-stylesheet。href="tutorialspointstyle.css" 和 type="text/css" 是目标应用程序在处理给定 XML 文档时将要使用的数据或指令。

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

Processing Instructions Rules

PI 可包含除 ?> 组合(解释为结束分隔符)之外的任何数据。以下是两个有效的 PI 示例 −

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

<?welcome?>

XML - Encoding

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

Encoding Types

主要有两种编码类型 −

  1. UTF-8

  2. UTF-16

UTF 表示 UCS 转换格式,UCS 本身表示通用字符集。数字 8 或 16 指的是用于表示字符的位数。它们要么是 8(1 到 4 个字节),要么是 16(2 或 4 个字节)。对于不包含编码信息的文档,默认设置为 UTF-8。

Syntax

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

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

UTF-16 编码的语法如下 −

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

Example

以下示例展示了编码声明 −

<?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 - Validation

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

  1. Well-formed XML document

  2. Valid XML document

Well-formed XML Document

如果 XML 文档遵守以下规则,则该文档称为 well-formed

  1. 非 DTD XML 文件必须@{{s0}、 apos(single quote)gt(&gt;)lt(&lt;)quot(double quote) 这些预定义字符实体。

  2. 必须遵循标签的顺序。也就是说,内部标签必须在关闭外部标签前关闭。

  3. 每个打开标签必须有闭合标签或者必须是一个自结束标签(<标题>……</标题> 或 <title/>)。

  4. 起始标签中只能有一个属性,并需要加上引号。

  5. amp(&amp;)apos(single quote)gt(&gt;)lt(&lt;)quot(double quote) 除此之外的实体必须声明。

Example

以下是良好格式 XML 文档的示例 −

<?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>

上述示例被称之为良好格式,原因如下 −

  1. 它定义了文档的类型。此处,文档类型为 element 类型。

  2. 它包含一个名为 address 的根元素。

  3. name、company 和 phone 等每个子元素都包含在其自释义标签中。

  4. 标签的顺序得到维护。

Valid XML Document

如果 XML 文档已正确格式化并关联有文档类型声明 (DTD),则称之为有效的 XML 文档。我们将在 XML - DTDs 章节中详细学习 DTD。

XML - DTDs

XML 文档类型声明,通常称为 DTD,是一种精确描述 XML 语言的方法。DTD 会检查 XML 文档结构的词汇和有效性,并与适当 XML 语言的语法规则对照。

XML DTD 可以指定在文档内部,或者保留在单独的文档中,然后单独引用。

Syntax

DTD 的基本语法如下−

<!DOCTYPE element DTD identifier
[
   declaration1
   declaration2
   ........
]>

在上述语法中,

  1. DTD 以 <!DOCTYPE 分隔符开头。

  2. 一个 element 告诉解析器从指定的根元素解析文档。

  3. DTD identifier 是文档类型定义的标识符,它可能是指向系统上文件的路径或指向互联网上文件的 URL。如果 DTD 指向外部路径,则称为 External Subset.

  4. The square brackets [ ] 包含一个可选的实体声明列表,称为内部子集。

Internal DTD

如果元素是在 XML 文件中声明的,则 DTD 被称为内部 DTD。要将其称为内部 DTD,XML 声明中的 standalone 属性必须设为 yes 。这意味着,声明独立于外部资源。

Syntax

以下是内部 DTD 的语法:

<!DOCTYPE root-element [element-declarations]>

其中 root-element 是根元素的名称,element-declarations 是声明元素的位置。

Example

以下是内部 DTD 的一个简单示例 −

<?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>

让我们浏览上述代码 −

Start Declaration − 使用以下声明开始 XML 声明。

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

DTD − 在 XML 头之后,紧跟着文档类型声明,一般称为 DOCTYPE −

<!DOCTYPE address [

DOCTYPE 声明的元素名称开头带有一个感叹号 (!)。DOCTYPE 通知解析器此 XML 文档有一个 DTD 关联。

DTD Body − DOCTYPE 声明之后是 DTD 的主体,您在此声明元素、属性、实体和符号。

<!ELEMENT address (name,company,phone)>
<!ELEMENT name (#PCDATA)>
<!ELEMENT company (#PCDATA)>
<!ELEMENT phone_no (#PCDATA)>

此处声明了多个元素,这些元素构成了 <name> 文档的词汇表。<!ELEMENT name (#PCDATA)>将元素 name 定义为 “#PCDATA” 类型。此处 #PCDATA 表示可解析的文本数据。

End Declaration − 最后,DTD 的声明部分使用关闭括号和关闭尖括号 ( ]> ) 关闭。这会有效结束定义,之后 XML 文档紧接着遵循。

Rules

  1. 文档类型声明必须出现在文档的开头(仅在 XML 头之前)- 在文档中的任何其他位置都不允许出现。

  2. 与 DOCTYPE 声明类似,元素声明必须以感叹号开头。

  3. 文档类型声明中的名称必须与根元素的元素类型匹配。

External DTD

在外部 DTD 中,元素在 XML 文件之外声明。通过指定系统属性(可以是合法的 .dtd 文件或有效的 URL)来访问它们。为了将其作为外部 DTD 引用,必须将 XML 声明中的 standalone 属性设置为 no 。这意味着声明包括来自外部来源的信息。

Syntax

以下是外部 DTD 的语法−

<!DOCTYPE root-element SYSTEM "file-name">

其中 file-name 是扩展名为 .dtd 的文件。

Example

以下示例展示了外部 DTD 用法−

<?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>

DTD 文件 address.dtd 的内容如下图所示:

<!ELEMENT address (name,company,phone)>
<!ELEMENT name (#PCDATA)>
<!ELEMENT company (#PCDATA)>
<!ELEMENT phone (#PCDATA)>

Types

您可以使用 system identifierspublic identifiers 来引用外部 DTD。

System Identifiers

系统标识符允许指定包含 DTD 声明的外部文件的位置。语法如下−

<!DOCTYPE name SYSTEM "address.dtd" [...]>

正如您所看到的,它包含关键词 SYSTEM 和指向文档位置的 URI 引用。

Public Identifiers

公共标识符提供了一种查找 DTD 资源的机制,并按如下方式编写:

<!DOCTYPE name PUBLIC "-//Beginning XML//DTD Address Example//EN">

正如您所看到的,它以关键词 PUBLIC 开头,后跟一个专业标识符。公共标识符用于标识目录中的一个条目。公共标识符可以遵循任何格式,但是,一种常用的格式称为 Formal Public Identifiers, or FPIs

XML - Schemas

XML Schema 通常称为 XML Schema Definition (XSD) 。它用于描述和验证 XML 数据的结构和内容。XML 模式定义元素、属性和数据类型。模式元素支持命名空间。它类似于描述数据库中数据的数据库模式。

Syntax

您需要在 XML 文档中声明模式,如下所示 −

Example

以下示例展示如何使用模式 −

<?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>

XML 模式背后的基本思想是它们描述了 XML 文档可以采用的合法格式。

Elements

正如我们在 XML - Elements 章节中所看到的,元素是 XML 文档的构建块。可以在 XSD 中如下定义元素 −

<xs:element name = "x" type = "y"/>

Definition Types

您可以通过以下方式定义 XML 模式元素 −

Simple Type

简单类型元素仅在文本上下文中使用。一些预定义的简单类型是:xs:integer、xs:boolean、xs:string、xs:date。例如 −

<xs:element name = "phone_number" type = "xs:int" />

Complex Type

复杂类型是其他元素定义的容器。这允许您指定哪些子元素一个元素可以包含,并在 XML 文档中提供一些结构。例如 −

<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>

在上面的示例中,Address 元素由子元素组成。这是其他 <xs:element> 定义的容器,允许在 XML 文档中构建一个简单的元素层次结构。

Global Types

通过全局类型,您可以在文档中定义一个单一的类型,所有其他引用都可以使用它。例如,假设您想要对公司的不同地址对人和公司进行常规化。在这样的情况下,您可以按如下方式定义一个常规类型 −

<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>

现在让我们在我们的示例中按如下方式使用这种类型 −

<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>

无需分别为 Address1 和 Address2 定义名称和公司两次,我们现在只需进行一次定义。这使得维护更简单,即,如果您决定向地址添加“邮政编码”元素,则只需在某一位置添加它们即可。

Attributes

XSD 中的属性在元素中提供额外信息。属性具有如下所示的名称和类型属性 −

<xs:attribute name = "x" type = "y"/>

XML - Tree Structure

XML 文档始终是描述性的。树结构通常称为 XML Tree ,它在轻松描述任何 XML 文档方面发挥着重要作用。

树结构包含根(父)元素、子元素等等。通过使用树结构,你可以了解从根开始的所有后续分支和子分支。解析从根开始,然后向下移动到一个元素的第一分支,从那里取第一个分支,依次类推到叶子节点。

Example

以下示例演示了简单的 XML 树结构 −

<?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>

以下树结构表示上述 XML 文档 −

tree structure

在上述图表中,有一个名为 <company> 的根元素。在其中,还有一个元素 <Employee>。在员工元素内部,有五个分支,分别命名为 <FirstName>、<LastName>、<ContactNo>、<Email> 和 <Address>。在 <Address> 元素内部,有三个子分支,分别命名为 <City> <State> 和 <Zip>。

XML - DOM

Document Object Model (DOM) 是 XML 的基础。XML 文档具有称为节点的信息单元层次结构;DOM 的作用是描述这些节点及其之间的关系。

DOM 文档是由以层次结构组织的节点或信息片段的集合。此层次结构允许开发人员浏览树,查找特定信息。由于 XML DOM 基于信息层次结构,因此 XML DOM 被称为基于树的。

另一方面,XML DOM 还提供了一个 API,允许开发人员在树的任何时间点添加、编辑、移动或者删除节点,以便创建应用程序。

Example

以下示例 (sample.htm) 将 XML 文档 (“address.xml”) 解析成 XML DOM 对象,然后用 JavaScript 从该对象中提取一些信息 −

<!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>

address.xml 的内容如下 −

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

现在让我们将这两个文件 sample.htmaddress.xml 保存在同一个目录 /xml 中,并通过在任何浏览器中打开 sample.htm 文件来执行该文件。这应该会产生以下输出。

xml dom example

在这里,您可以了解到如何提取每个子节点以显示其值。

XML - Namespaces

Namespace 是唯一名称的集合。命名空间是一种机制,通过它可以将元素和属性名分配给一个组。命名空间由 URI(统一资源标识符)识别。

Namespace Declaration

命名空间使用保留的属性声明。这样一种属性名必须是 xmlns 或以 xmlns: 开头,如下所示 −

<element xmlns:name = "URL">

Syntax

  1. 命名空间以关键词 xmlns 开头。

  2. 单词 name 是命名空间前缀。

  3. URL 是命名空间标识符。

Example

命名空间只影响文档中的有限区域。包含声明及其所有后代的元素都在命名空间的作用域中。以下是 XML 命名空间的一个简单示例 −

<?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>

在这里,命名空间前缀是 cont ,命名空间标识符(URI)是 www.tutorialspoint.com/profile。这意味着具有 cont 前缀(包括联系元素)的元素名和属性名都属于 www.tutorialspoint.com/profile 命名空间。

XML - Databases

XML Database 用于以 XML 格式存储大量的信息。随着各个领域中对 XML 的使用日益增多,需要有一个安全的地方来存储 XML 文档。存储在数据库中的数据可以使用 XQuery 查询、序列化并导出为所需的格式。

XML Database Types

有两种主要的 XML 数据库 −

  1. XML- enabled

  2. Native XML (NXD)

XML - Enabled Database

支持 XML 的数据库只不过是为 XML 文档转换提供的扩展。这是一个关系数据库,其中数据存储在由行和列组成的表中。表包含一组记录,而记录又包含字段。

Native XML Database

原生 XML 数据库基于容器而不是表格格式。它可以存储大量的 XML 文档和数据。原生 XML 数据库通过 XPath 表达式查询。

原生 XML 数据库比启用 XML 的数据库有优势。它非常有能力存储、查询和维护 XML 文档,而启用 XML 的数据库则不能。

Example

以下示例演示了 XML 数据库 −

<?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>

这里创建了一个联系人表,其中包含联系人的记录(contact1 和 contact2),而联系人记录又包含三个实体 − 名称、公司和电话。

XML - Viewers

这一章节对各种 methods to view an XML document 进行了描述。可以使用一个简单的文本编辑器或任何浏览器来查看 XML 文档。大多数主流浏览器都支持 XML。XML 文件可以通过双击 XML 文档(如果它是一个本地文件)或者在地址栏中键入 URL 路径(如果该文件位于服务器上),以与我们以相同的方式在浏览器中打开其他文件的方式在浏览器中打开。XML 文件以 ".xml" 扩展名保存。

让我们探讨各种查看 XML 文件的方法。使用以下示例 (sample.xml) 来查看此章的所有章节。

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

Text Editors

可以按如下所示,使用任何简单的文本编辑器(例如记事本、TextPad 或 TextEdit)来创建或查看 XML 文档 −

xml viewer notepad

Firefox Browser

通过双击该文件在 Chrome 中打开以上 XML 代码。XML 代码会以带颜色的编码形式显示,这使得代码更具可读性。它在 XML 元素的左侧显示加号 () 或减号 (-)。当我们单击减号 (-) 时,代码会被隐藏。当我们单击加号 () 时,代码行会得到展开。Firefox 中的输出如下所示 −

xml viewer firefox

Chrome Browser

在 Chrome 浏览器中打开以上 XML 代码。代码将按如下所示显示 −

xml viewer chrome

Errors in XML Document

如果 XML 代码缺少一些标签,则会在浏览器中显示一条消息。让我们尝试在 Chrome 中打开以下 XML 文件 −

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

在以上代码中,起始标签和结束标签不匹配(请参阅 contact_info 标签),因此浏览器会显示如下所示的错误消息 −

xml viewer error

XML - Editors

XML Editor 是一个标记语言编辑器。可以通过现有的编辑器(如记事本、写字板或任何类似的文本编辑器)编辑或创建 XML 文档。您还可以在线查找专业 XML 编辑器或下载,该编辑器具有更强大的编辑功能,例如:

  1. 自动关闭未关闭的标签。

  2. It strictly checks syntax.

  3. 使用颜色突出显示 XML 语法以提高可读性。

  4. 帮助您编写有效的 XML 代码。

  5. 提供针对 DTD 和模式的 XML 文档的自动验证。

Open Source XML Editors

以下是一些开源 XML 编辑器:

  1. Online XML Editor − 这是一个可以在线使用的轻量级 XML 编辑器。

  2. Xerlin − Xerlin 是一个适用于 Java 2 平台的开源 XML 编辑器,采用 Apache 许可证发布。这是一个基于 Java 的 XML 建模应用程序,可以轻松创建和编辑 XML 文件。

  3. CAM - Content Assembly Mechanism − CAM XML 编辑器工具随 Oracle 赞助的 XML+JSON+SQL Open-XDX 一起提供。

XML - Parsers

XML parser 是一个软件库或一个包,它提供接口,让客户端应用程序能够处理 XML 文档。它检查 XML 文档是否格式正确,还可以验证 XML 文档。现代浏览器具有内置的 XML 解析器。

下图显示了 XML 解析器如何与 XML 文档进行交互 −

xml parser

解析器的目标是将 XML 转换称可读代码。

为了简化解析过程,一些商用产品可用于促进 XML 文档的分解并产生更可靠的结果。

以下是常用的一些解析器:

  1. MSXML (Microsoft Core XML Services) − 这是一个由 Microsoft 提供的标准 XML 工具集,其中包括一个解析器。

  2. System.Xml.XmlDocument − 此类是 .NET 库的一部分,该库包含许多与 XML 相关的不同类。

  3. Java built-in parser − Java 库有自己的解析器。该库的设计让您可以将内置解析器替换为外部实现,例如 Apache 或 Saxon 的 Xerces。

  4. Saxon − Saxon 为解析、转换和查询 XML 提供工具。

  5. Xerces − Xerces 在 Java 中实现,由著名的开源 Apache 软件基金会开发。

XML - Processors

当软件程序读取 XML 文档并相应采取操作时,这称为处理 XML。能读取和处理 XML 文档的任何程序都称为 XML 处理器。XML 处理器读取 XML 文件并将其转换为程序其他部分可访问的在内存结构中。

最基本的 XML 处理器读取 XML 文档并将其转换为供其他程序或子例程使用的内部表示。这称为解析器,它是每个 XML 处理程序的重要组成部分。

处理器涉及处理说明,这可以在章节 Processing Instruction 中研究。

Types

XML 处理器根据是否检查 XML 文档的有效性分为 validatingnon-validating 类型。发现有效性错误的处理器必须能够报告此错误,但可以继续正常处理。

A few validating parsers are − xml4c(IBM,在 C++ 中)、xml4j(IBM,在 Java 中)、MSXML(Microsoft,在 Java 中)、TclXML(TCL)、xmlproc(Python)、XML::Parser(Perl)、Java Project X(Sun,在 Java 中)。

A few non-validating parsers are − OpenXML(Java)、Lark(Java)、xp(Java)、AElfred(Java)、expat ©、XParse(JavaScript)、xmllib(Python)。