什么是XML
XML,全称 eXtensible Markup Language(可扩展标记语言),是一种用于标记电子文件使其具有结构性的标记语言。XML 被设计用来传输和存储数据,其重点在于数据的内容,而不是数据的显示,这与 HTML(HyperText Markup Language)形成了对比,后者更多地关注于如何呈现数据。
以下是一些关于 XML 的关键特点:
- 可扩展性:XML 的一大特点是可扩展,允许用户自定义标记,这使得它能够适应各种数据描述的需求。
- 自我描述性:XML 文件包含了数据的结构信息,这意味着数据不仅仅是纯文本,还包括了描述数据结构的标记。
- 严格规范:XML 文档必须是“格式良好”(Well-formed)的,即所有开始标记必须有对应的结束标记,所有属性值必须加引号,所有标记必须正确嵌套等。
- 文档类型定义(DTD)和 Schema:为了进一步规范 XML 文件的结构,可以使用 DTD 或 XML Schema 来定义 XML 文件的结构规则。
- 跨平台兼容性:XML 是一种基于文本的格式,可以在不同的操作系统和应用之间交换数据。
- 数据传输:XML 常被用于 Web 服务和应用程序之间的数据传输,因为其格式清晰,易于解析和生成。
- 存储:XML 也用于存储数据,尤其是在需要人类可读性和结构化的场景中。
- 解析:XML 文件可以使用 DOM(Document Object Model)或 SAX(Simple API for XML)等技术来解析和处理。
- 命名空间:XML 支持命名空间,这有助于避免不同来源的元素名称发生冲突。
- 注释:XML 支持注释,可以用来在文件中添加非结构化的文本信息,帮助理解和维护文件。
- 编码:XML 文件可以使用不同的字符编码,如 UTF-8,以支持全球范围内的字符集。
XML 曾经是数据交换的主流格式之一,但随着 JSON(JavaScript Object Notation)的兴起,JSON 因其更简洁的格式和在 Web 应用中的广泛适用性,在许多情况下取代了 XML 的位置。尽管如此,XML 在某些领域和应用中仍然非常重要,特别是在那些需要严格数据结构和格式的场景中。
HTML与XML
HTML(HyperText Markup Language)和XML(eXtensible Markup Language)虽然都属于标记语言,但在设计目的、语法和使用场景上有显著的区别。下面是它们之间的一些主要区别:
-
设计目的:
- HTML: 主要用于网页的布局和显示,强调的是如何呈现信息,即信息的表现形式。
- XML: 主要用于数据的存储和传输,强调的是数据的结构和意义,即信息的内容。
-
语法灵活性:
- HTML: 具有较大的灵活性,比如可以省略结束标签,不区分大小写,属性值的引号可选。
- XML: 更加严格,要求所有标签都必须正确关闭,严格区分大小写,属性值必须用引号包围,且不允许有重复的属性。
-
标记语义:
- HTML: 使用预定义的标签,如
<div>,<span>,<p>等,这些标签有特定的含义和用途。 - XML: 标签没有预定义,完全自定义,允许用户定义自己的标签来描述数据,如
<customer>,<order>等。
- HTML: 使用预定义的标签,如
-
数据焦点:
- HTML: 关注数据的外观和布局,适合于网页展示。
- XML: 关注数据的结构和内容,适合于数据交换和存储。
-
可扩展性:
- HTML: 不具备扩展性,其标签和属性是固定的。
- XML: 可以用于定义新的标记语言,如RSS、SOAP、XSLT等,具有高度的可扩展性。
-
解析行为:
- HTML: 解析器通常会容忍错误,如忽略未关闭的标签或多余的空格。
- XML: 解析器要求严格遵循语法规则,任何语法错误都会导致解析失败。
-
平台和语言无关性:
- HTML: 虽然可以在各种平台上显示,但其解释和渲染可能因浏览器而异。
- XML: 独立于平台和语言,可以被任何能够解析XML的软件或语言读取和处理。
-
数据描述:
- HTML: 不包含数据描述信息,通常需要额外的CSS和JavaScript来增强页面的样式和交互。
- XML: 数据自我描述,可以通过DTD(Document Type Definition)或Schema来定义数据的结构和约束。
总体来说,HTML更适合于网页展示,而XML更适合于数据存储、交换和处理。两者在现代Web开发中都有重要的应用,但各自专注于不同的领域。
XML文档约束
XML文档约束是用来确保XML文档符合预定的结构和数据类型规则的一系列机制。这很重要,因为约束可以帮助验证XML文档是否按照预期的方式构建,从而保证数据的一致性和完整性。我们将介绍一下 DTD 和 Schema 约束:
DTD约束
DTD(Document Type Definition,文档类型定义)是XML中最早使用的约束机制,用于定义XML文档的结构和元素的属性。DTD定义了一组规则,规定了哪些元素可以出现在文档中,它们可以包含什么类型的内容,以及元素和属性的顺序和组合规则。
DTD的基本组成部分:
- 元素声明:定义元素的类型,如元素可以包含其他元素或者文本。
<!ELEMENT elementName EMPTY>
<!ELEMENT elementName ANY>
<!ELEMENT elementName (element1, element2?, element3*)>
- 实体声明:定义可以被替换的文本或外部资源。
<!ENTITY entityName "replacement text">
<!ENTITY externalEntity SYSTEM "http://www.example.com/external.dtd">
- 属性列表声明:定义元素可以拥有的属性。
<!ATTLIST elementName attributeName CDATA #IMPLIED>
- 符号类型:
*表示零次或多次;+表示一次或多次;?表示零次或一次。 - 数据类型:
CDATA表示字符数据;ID和IDREF用于唯一标识和引用;ENUMERATION用于指定属性或元素的值的固定集合。
使用DTD:
- 内嵌DTD:DTD可以放在XML文档的
<!DOCTYPE>声明中,直接内嵌在XML文档里。
<?xml version="1.0"?>
<!DOCTYPE document [
<!ELEMENT document (title, content)>
<!ELEMENT title (#PCDATA)>
<!ELEMENT content (#PCDATA)>
]>
<document>
<title>My Document</title>
<content>This is the content of my document.</content>
</document>
- 外部DTD:DTD也可以是一个独立的文件,通过
<!DOCTYPE>声明引用。
<?xml version="1.0"?>
<!DOCTYPE document SYSTEM "document.dtd">
<document>
<title>My Document</title>
<content>This is the content of my document.</content>
</document>
document.dtd 文件内容可能如下:
<!ELEMENT document (title, content)>
<!ELEMENT title (#PCDATA)>
<!ELEMENT content (#PCDATA)>
- 公共DTD:如果DTD是广泛使用的标准,可以使用公共标识符引用。
<?xml version="1.0"?>
<!DOCTYPE document PUBLIC "-//example//DTD Document//EN"
"http://www.example.com/dtd/document.dtd">
<document>
<!-- ... -->
</document>
验证XML文档:
当XML文档被解析时,如果指定了DTD,解析器将自动检查文档是否符合DTD定义的规则。如果文档不符合DTD的约束,解析器将报告一个错误。这种验证有助于确保数据的完整性和一致性。
使用DTD的缺点是它不支持XML命名空间和复杂的数据类型。对于更复杂的约束需求,通常会使用XML Schema(XSD)。然而,DTD在一些遗留系统和简单场景中仍然被广泛使用。
Schema约束
XML Schema(XSD)是W3C(World Wide Web Consortium)定义的一种用于描述XML文档结构的语言。与DTD(Document Type Definition)相比,XML Schema提供了更丰富、更强大的功能,包括复杂的数据类型定义、命名空间的支持以及更详细的元素和属性约束。
XML Schema的基本组成部分:
- Schema元素:这是XML Schema文档的根元素,它定义了整个Schema的命名空间和目标命名空间。
- Element声明:用于定义XML文档中的元素,可以指定元素的类型、是否可选、是否重复等。
- ComplexType和SimpleType:用于定义数据类型。
ComplexType可以包含子元素和属性,而SimpleType通常用于基本数据类型(如字符串、整数、日期等)的扩展。 - Attribute声明:用于定义元素的属性,可以指定属性的类型、是否可选等。
- Sequence、All、Choice:这些元素用于控制子元素的排列顺序和组合方式。
- MinOccurs和MaxOccurs:用于指定元素或属性的最小和最大出现次数。
如何使用XML Schema:
创建XML Schema文件:
一个典型的XML Schema文件可能如下所示:
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"
targetNamespace="http://www.example.com/books"
xmlns:b="http://www.example.com/books"
elementFormDefault="qualified">
<xs:element name="book">
<xs:complexType>
<xs:sequence>
<xs:element name="title" type="xs:string"/>
<xs:element name="author" type="xs:string"/>
<xs:element name="year" type="xs:gYear"/>
</xs:sequence>
</xs:complexType>
</xs:element>
<!-- 更多的类型和元素定义 -->
</xs:schema>
引用XML Schema:
在XML文档中引用XSD文件,可以使用<!DOCTYPE>声明(虽然这种方式在XML 1.0中是非规范的)或在文档根元素上使用xsi:noNamespaceSchemaLocation或xsi:schemaLocation属性:
<?xml version="1.0"?>
<book xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:noNamespaceSchemaLocation="book.xsd">
<title>The Great Gatsby</title>
<author>F. Scott Fitzgerald</author>
<year>1925</year>
</book>
或
<?xml version="1.0"?>
<ns:book xmlns:ns="http://www.example.com/books"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.example.com/books book.xsd">
<ns:title>The Great Gatsby</ns:title>
<ns:author>F. Scott Fitzgerald</ns:author>
<ns:year>1925</ns:year>
</ns:book>
验证XML文档:
验证XML文档是否符合其Schema,可以使用多种工具或编程语言中的库。例如,Java中有JAXB和XSOM,Python中有lxml库,而在.NET中则有XML Schema Definition Tool (xsd.exe)。
总之,XML Schema提供了非常强大的功能来定义和约束XML文档的结构和内容,适用于需要精细控制和数据验证的应用场景。