一文带你弄懂XML

419 阅读8分钟

什么是XML

XML,全称 eXtensible Markup Language(可扩展标记语言),是一种用于标记电子文件使其具有结构性的标记语言。XML 被设计用来传输和存储数据,其重点在于数据的内容,而不是数据的显示,这与 HTML(HyperText Markup Language)形成了对比,后者更多地关注于如何呈现数据。

以下是一些关于 XML 的关键特点:

  1. 可扩展性:XML 的一大特点是可扩展,允许用户自定义标记,这使得它能够适应各种数据描述的需求。
  2. 自我描述性:XML 文件包含了数据的结构信息,这意味着数据不仅仅是纯文本,还包括了描述数据结构的标记。
  3. 严格规范:XML 文档必须是“格式良好”(Well-formed)的,即所有开始标记必须有对应的结束标记,所有属性值必须加引号,所有标记必须正确嵌套等。
  4. 文档类型定义(DTD)和 Schema:为了进一步规范 XML 文件的结构,可以使用 DTD 或 XML Schema 来定义 XML 文件的结构规则。
  5. 跨平台兼容性:XML 是一种基于文本的格式,可以在不同的操作系统和应用之间交换数据。
  6. 数据传输:XML 常被用于 Web 服务和应用程序之间的数据传输,因为其格式清晰,易于解析和生成。
  7. 存储:XML 也用于存储数据,尤其是在需要人类可读性和结构化的场景中。
  8. 解析:XML 文件可以使用 DOM(Document Object Model)或 SAX(Simple API for XML)等技术来解析和处理。
  9. 命名空间:XML 支持命名空间,这有助于避免不同来源的元素名称发生冲突。
  10. 注释:XML 支持注释,可以用来在文件中添加非结构化的文本信息,帮助理解和维护文件。
  11. 编码:XML 文件可以使用不同的字符编码,如 UTF-8,以支持全球范围内的字符集。

XML 曾经是数据交换的主流格式之一,但随着 JSON(JavaScript Object Notation)的兴起,JSON 因其更简洁的格式和在 Web 应用中的广泛适用性,在许多情况下取代了 XML 的位置。尽管如此,XML 在某些领域和应用中仍然非常重要,特别是在那些需要严格数据结构和格式的场景中。

HTML与XML

HTML(HyperText Markup Language)和XML(eXtensible Markup Language)虽然都属于标记语言,但在设计目的、语法和使用场景上有显著的区别。下面是它们之间的一些主要区别:

  1. 设计目的:

    • HTML: 主要用于网页的布局和显示,强调的是如何呈现信息,即信息的表现形式。
    • XML: 主要用于数据的存储和传输,强调的是数据的结构和意义,即信息的内容。
  2. 语法灵活性:

    • HTML: 具有较大的灵活性,比如可以省略结束标签,不区分大小写,属性值的引号可选。
    • XML: 更加严格,要求所有标签都必须正确关闭,严格区分大小写,属性值必须用引号包围,且不允许有重复的属性。
  3. 标记语义:

    • HTML: 使用预定义的标签,如 <div>, <span>, <p> 等,这些标签有特定的含义和用途。
    • XML: 标签没有预定义,完全自定义,允许用户定义自己的标签来描述数据,如 <customer>, <order> 等。
  4. 数据焦点:

    • HTML: 关注数据的外观和布局,适合于网页展示。
    • XML: 关注数据的结构和内容,适合于数据交换和存储。
  5. 可扩展性:

    • HTML: 不具备扩展性,其标签和属性是固定的。
    • XML: 可以用于定义新的标记语言,如RSS、SOAP、XSLT等,具有高度的可扩展性。
  6. 解析行为:

    • HTML: 解析器通常会容忍错误,如忽略未关闭的标签或多余的空格。
    • XML: 解析器要求严格遵循语法规则,任何语法错误都会导致解析失败。
  7. 平台和语言无关性:

    • HTML: 虽然可以在各种平台上显示,但其解释和渲染可能因浏览器而异。
    • XML: 独立于平台和语言,可以被任何能够解析XML的软件或语言读取和处理。
  8. 数据描述:

    • 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的基本组成部分:

  1. 元素声明:定义元素的类型,如元素可以包含其他元素或者文本。
<!ELEMENT elementName EMPTY>
<!ELEMENT elementName ANY>
<!ELEMENT elementName (element1, element2?, element3*)>
  1. 实体声明:定义可以被替换的文本或外部资源。
<!ENTITY entityName "replacement text">
<!ENTITY externalEntity SYSTEM "http://www.example.com/external.dtd">
  1. 属性列表声明:定义元素可以拥有的属性。
<!ATTLIST elementName attributeName CDATA #IMPLIED>
  1. 符号类型* 表示零次或多次;+ 表示一次或多次;? 表示零次或一次。
  2. 数据类型CDATA 表示字符数据;IDIDREF 用于唯一标识和引用;ENUMERATION 用于指定属性或元素的值的固定集合。

使用DTD:

  1. 内嵌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>
  1. 外部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)>
  1. 公共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的基本组成部分:

  1. Schema元素:这是XML Schema文档的根元素,它定义了整个Schema的命名空间和目标命名空间。
  2. Element声明:用于定义XML文档中的元素,可以指定元素的类型、是否可选、是否重复等。
  3. ComplexType和SimpleType:用于定义数据类型。ComplexType可以包含子元素和属性,而SimpleType通常用于基本数据类型(如字符串、整数、日期等)的扩展。
  4. Attribute声明:用于定义元素的属性,可以指定属性的类型、是否可选等。
  5. Sequence、All、Choice:这些元素用于控制子元素的排列顺序和组合方式。
  6. 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:noNamespaceSchemaLocationxsi: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文档的结构和内容,适用于需要精细控制和数据验证的应用场景。