跳转到内容

XML - 数据交换管理/单一实体

来自维基教科书,开放世界中的开放书籍



上一章 下一章
XML 简介 基本数据结构




学习目标


  • 介绍 XML 文档、模式和样式表
  • 描述和创建 XML 文档
  • 描述和创建 XML 模式
  • 描述和创建 XML 样式表


在本章中,我们将开始使用 XML 文档、模式和样式表来练习使用 XML。XML 文档以结构化的分层格式组织数据和信息。XML 模式为给定 XML 文档的结构提供标准和规则。XML 模式还支持数据传输。XSL (XML 样式表) 允许对 XML 文档中的内容进行独特呈现。

在第一章“XML 简介”中,您了解了 XML 是什么、为什么它有用以及如何使用它。因此,现在您想创建您自己的 XML 文档。在本章中,我们将向您展示用于创建 XML 文档的基本组件。本章是所有后续章节的基础--它有点长,但不要害怕。我们将带您了解 XML 文档的基础知识。


本章分为三个部分

  • XML 文档
  • XML 模式
  • XML 样式表 (XSL)


正如您在上一章中了解到的,XML 模式和样式表本质上是专门的 XML 文档。在这三个部分中,我们将检查创建文档所需的布局和组件。在 XML 文档、模式和样式表部分的末尾,有一些链接向您展示如何使用 XML 编辑器来创建文档。在页面底部,有一个链接指向本章的练习和答案。

在开始创建 XML 文档之前,您需要的第一件事是一个问题--您想通过使用 XML 来存储和共享数据或信息来解决的问题。您需要一些实体,您可以收集有关该实体的信息,然后以各种格式访问这些信息。因此,我们为您创建了一个。

要开发 XML 文档和模式,请从一个数据模型开始,该模型描述实际交换数据的真实情况。创建了高保真模型后,数据模型可以轻松地转换为 XML 文档和模式。在本章中,我们从一个非常简单的情况开始,并在后续章节中扩展复杂性,以教您更多有关 XML 的功能。

我们的起点是一个单一实体 CITY,如以下图所示。虽然我们的重点是这个单一实体,但要将 CITY 映射到 XML 模式,我们需要有一个包含 CITY 的实体。在这种情况下,我们创建了 TOURGUIDE。将 TOURGUIDE 视为包含许多城市,在本例中,TOURGUIDE 没有属性或标识符。它只是城市数据的容器。


图 1:数据模型 - 旅游指南


XML 文档

[编辑 | 编辑源代码]

XML 文档是一个包含 XML 代码和语法的文件。XML 文档具有 .xml 文件扩展名。

我们将检查 XML 文档的功能和组件。


  • 序言 (XML 声明)
  • 元素
  • 属性
  • 遵循的规则
  • 格式良好且有效的 XML 文档


下面是一个使用我们的旅游指南模型的示例 XML 文档。在描述 XML 文档的部分时,我们将参考它。

图 2:城市实体的 XML 文档

  <?xml version="1.0" encoding="UTF-8"?>
  <tourGuide xmlns:xsi='http://www.w3.org/2001/XMLSchema-instance'
    xsi:noNamespaceSchemaLocation='city.xsd'>
    <city>
        <cityName>Belmopan</cityName>
        <adminUnit>Cayo</adminUnit>
        <country>Belize</country>
        <population>11100</population>
        <area>5</area>
        <elevation>130</elevation>
        <longitude>88.44</longitude>
        <latitude>17.27</latitude>
        <description>Belmopan is the capital of Belize</description>
        <history>Belmopan was established following the devastation of the
           former capital, Belize City, by Hurricane Hattie in 1965. High 
           ground and open space influenced the choice and ground-breaking 
           began in 1966.  By 1970 most government offices and operations had 
           already moved to the new location.
        </history>
    </city>
    <city>
        <cityName>Kuala Lumpur</cityName>
        <adminUnit>Selangor</adminUnit>
        <country>Malaysia</country>
        <population>1448600</population>
        <area>243</area>
        <elevation>111</elevation>
        <longitude>101.71</longitude>
        <latitude>3.16</latitude>
        <description>Kuala Lumpur is the capital of Malaysia and the largest 
            city in the nation</description>
        <history>The city was founded in 1857 by Chinese tin miners and  
            preceded Klang.  In 1880 the British government transferred their 
            headquarters from Klang to Kuala Lumpur, and in 1896 it became the 
            capital of Malaysia. 
        </history>
    </city>
    <city>
        <cityName>Winnipeg</cityName>
        <adminUnit>St. Boniface</adminUnit>
        <country>Canada</country>
        <population>618512</population>
        <area>124</area>
        <elevation>40</elevation>
        <longitude>97.14</longitude>
        <latitude>49.54</latitude>
        <description>Winnipeg has two seasons. Winter and Construction.</description>
        <history>The city was founded by people at the forks (Fort Garry)
         trading in pelts with the Hudson Bay Company. Ironically, 
         The Bay was bought by America.
        </history>
    </city>
  </tourGuide>

序言 (XML 声明)

[编辑 | 编辑源代码]

XML 文档从序言开始。序言告知读者和计算机某些规范,这些规范使文档符合 XML 标准。第一行是 XML 声明(也是此基本 XML 文档中唯一的行)。

图 3:XML 文档 - 序言

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

xml   =   这是一个 XML 文档
version="1.0"   =   XML 版本(XML 1.0 是 W3C 推荐的版本)
encoding="UTF-8"   =   文档中使用的字符编码 - UTF 8 对应于 8 位编码的 Unicode 字符(即编码国际文档的标准方式) - Unicode 为每个字符提供一个唯一编号。
XML 声明的另一个潜在属性
standalone="yes"   =   文档的依赖性('yes' 表示文档不需要另一个文档来完成内容)

您在 XML 文档中看到的大部分内容都由 XML 元素组成。元素通过它们的标签识别,这些标签以 < 或 </ 开头,以 > 或 /> 结尾。开始标签看起来像这样:<element attribute="value">,左边是左尖括号 (<),后面是元素类型名称、可选属性,最后是右尖括号 (>)。结束标签看起来像这样:</element>,类似于开始标签,但左尖括号和元素类型名称之间有一个斜杠 (/),并且没有属性。

当开始标签和结束标签之间没有任何内容时,XML 允许您将它们组合成一个空元素标签,该标签可以包含开始标签可以包含的所有内容:<img src="Belize.gif" />。此标签必须以斜杠和右尖括号 (/>) 结尾,以便将其与开始标签区分开来。

XML 文档围绕一个主要主题设计,一个涵盖所有其他项目和主题的总括概念;分析此主题以确定其组成部分,创建类别和子类别。主要主题及其组成部分由元素描述。在我们的示例 XML 文档中,'tourGuide' 是主要主题;'city' 是一个类别;'population' 是 'city' 的一个子类别;层次结构可以进一步扩展:'males' 和 'females' 可以是 'population' 的子类别。元素遵循将在“遵循的规则”部分中描述的几个语法规则。


我们在 <tourGuide> 开始标签中省略了属性 - 这将在 XML 模式部分进行解释。

图 4:城市实体 XML 文档的元素

  <tourGuide>
    <city>
        <cityName>Belmopan</cityName>
        <adminUnit>Cayo</adminUnit>
        <country>Belize</country>
        <population>11100</population>
        <area>5</area>
        <elevation>130</elevation>
        <longitude>88.44</longitude>
        <latitude>17.27</latitude>
        <description>Belmopan is the capital of Belize</description>
        <history>Belmopan was established following the devastation of the
           former capital, Belize City, by Hurricane Hattie in 1965. High 
           ground and open space influenced the choice and ground-breaking 
           began in 1966.  By 1970 most government offices and operations had 
           already moved to the new location.
        </history>
    </city>
  </tourGuide>


元素层次结构

[编辑 | 编辑源代码]
  • 根元素  -   这是 XML 文档的主要主题元素。每个文档必须且只能有一个根元素。所有其他元素都包含在此根元素内。根元素位于 XML 声明之后。
  • 父元素  -   这是包含其他元素(子元素)的任何元素。在我们的示例中,<city> 是一个父元素。
  • 子元素  -   这是包含在另一个元素(父元素)内的任何元素。在我们的示例中,<population> 是 <city> 的一个子元素。
  • 同级元素  -   这些是共享相同父元素的元素。在我们的示例中,<cityName>、<adminUnit>、<country>、<population>、<area>、<elevation>、<longitude>、<latitude>、<description> 和 <history> 都是同级元素。


属性通过提供附加或必需的信息来帮助修改给定元素的内容。它们包含在元素的开始标签内。在我们的示例 XML 文档代码中,我们可以利用属性来指定用于确定面积和海拔的度量单位(可以是英尺、码、米、公里等);在这种情况下,我们可以将属性命名为“measureUnit”并在“area”和“elevation”的开始标签内定义它。


       <adminUnit class="state">Cayo</adminUnit>
       <adminUnit class="region">Selangor</adminUnit>


上述属性示例也可以写成


1. 使用子元素

     <adminUnit>
          <class>state</class>
          <name>Cayo</name>
     </adminUnit>
     <adminUnit>
          <class>region</class>
          <name>Selangor</name>
     </adminUnit>

2. 使用空元素

    <adminUnit class="state" name="Cayo" />
    <adminUnit class="region" name="Selangor" />


属性可以用于

  • 提供未在数据中定义的更多信息
  • 定义元素的特征(大小、颜色、样式)
  • 确保在所有实例中包含有关元素的信息

但是,属性可能更难操作,并且有一些限制。如果您需要更多自由度,请考虑使用子元素。


遵循的规则

[编辑 | 编辑源代码]

这些规则旨在帮助计算机读取您的 XML 文档。

  • XML 文档的第一行必须是 XML 声明(序言)。
  • XML 文档的主要主题是在根元素中建立的,所有其他元素都必须包含在此根元素的开始和结束标签内。
  • 每个元素都必须有一个开始标签和一个结束标签 - 没有例外

(例如 <element>data stuff</element>)。

  • 标签必须以特定的顺序嵌套

=> 父元素的开始和结束标签必须包含其所有子元素的标签;这样,您首先关闭最后打开的标签

<parentElement>
      <childElement1>data</childElement1>
      <childElement2>
              <subChildElementA>data</subChildElementA>
              <subChildElementB>data</subChildElementB>
      </childElement2>
      <childElement3>data</childElement3>
</parentElement>
  • 属性值应在其周围有引号,并且没有空格。
  • 空标签或空元素必须在标签末尾有一个空格和一个斜杠(/)。
  • XML 语言中的注释以“<!--”开头,以“-->”结尾。


XML 元素命名约定

[编辑 | 编辑源代码]

可以使用任何名称,但想法是使名称对可能阅读文档的人有意义。

  • XML 元素只能以字母或下划线字符开头。
  • 名称不能以字符串“xml”开头,该字符串为 XML 规范保留。
  • 名称不能包含空格。
  • “:”不应在元素名称中使用,因为它被保留用于命名空间(这将在后面的章节中详细介绍)。
  • 名称可以包含字母、数字或其他字符的混合。


XML 文档通常具有相应的数据库。数据库将包含与 XML 文档中的元素相对应的字段。一个好习惯是将数据库的命名规则用于 XML 文档中的元素。

DTD(文档类型定义)验证 - 简单示例

[编辑 | 编辑源代码]
简单内部 DTD
[编辑 | 编辑源代码]
 <?xml version="1.0"?>
 <!DOCTYPE cdCollection [
    <!ELEMENT cdCollection (cd)>
    <!ELEMENT cd (title, artist, year)>
    <!ELEMENT title (#PCDATA)>
    <!ELEMENT artist (#PCDATA)>
    <!ELEMENT year (#PCDATA)>
 ]>
 <cdCollection>
  <cd>
    <title>Dark Side of the Moon</title>
    <artist>Pink Floyd</artist>
    <year>1973</year>
  </cd>
 </cdCollection>

将使用的每个元素都必须包含在 DTD 中。不要忘记包含根元素,即使您已经在 DTD 的开头指定了它。您必须在 <!ELEMENT> 标签中再次指定它。<!ELEMENT cdCollection (cd)> 根元素 <cdCollection> 包含文档中的所有其他元素,但只有一个直接子元素:<cd>。因此,您需要在括号中指定子元素(只需要指定直接子元素)。<!ELEMENT cd (title, artist, year)> 使用此行,我们定义 <cd> 元素。请注意,此元素包含子元素 <title>、<artist> 和 <year>。这些元素按特定顺序拼写出来。创建 XML 文档时必须遵循此顺序。如果更改元素的顺序(使用此特定 DTD),文档将无法验证。<!ELEMENT title (#PCDATA)> 剩下的三个标签 <title>、<artist> 和 <year> 实际上不包含其他标签。但是,它们确实包含一些需要解析的文本。您可能还记得在之前的讲座中,此数据称为解析字符数据或 #PCDATA。因此,#PCDATA 在括号中指定。因此,此简单的 DTD 概述了您在此 XML 文件中看到的全部内容。只要我们坚持使用此 DTD,就无法添加或删除任何内容。您可以更改的唯一内容是标签之间的 #PCDATA 文本部分。

增加复杂性
[编辑 | 编辑源代码]

有时您可能希望在特定元素中放入的不仅仅是字符数据,或者不仅仅是子元素。这称为混合内容。例如,假设您希望能够将字符数据或子元素(例如 <b> 标签)放入 <description> 元素中

 <!ELEMENT description (#PCDATA | b | i )*>

这种特定安排允许我们同时使用 PCDATA、<b> 标签或 <i> 标签。但有一点需要注意的是,如果您要混合 PCDATA 和其他元素,则分组必须以星号 (*) 后缀结尾。此声明允许我们在 XML 文档中添加以下内容(当然是在定义各个元素之后)

  <cd>
    <title>Love. Angel. Music. Baby</title>
    <artist>Gwen Stefani</artist>
    <year>2004</year>
    <genre>pop</genre>
    <description>
      This is a great album from former  
      <nowiki><i>No Doubt</i> singer <b>Gwen Stephani</b>.</nowiki>
    </description>
  </cd>

对于属性,这与元素略有不同。请参见以下示例

  <cd remaster_date=”1992”>
    <title>Dark Side of the Moon</title>
    <artist>Pink Floyd</artist>
    <year>1973</year>
  </cd>

为了验证,它必须在 DTD 中指定。属性内容模型使用以下方法指定

 <!ATTLIST element_name attribute_name attribute_type default_value>

让我们使用它来验证我们的 CD 示例

 <!ATTLIST cd remaster_date CDATA #IMPLIED>
 <ATTLIST person gender (male|female) “male”>
为元素分组属性
[编辑 | 编辑源代码]

如果特定元素要具有许多不同的属性,请将它们像这样分组

<!ATTLIST car horn CDATA #REQUIRED
             seats CDATA #REQUIRED
     steeringwheel CDATA #REQUIRED
             price CDATA #IMPLIED>
添加静态验证,用于必须具有特定值的项目
[编辑 | 编辑源代码]
<!ATTLIST classList   classNumber CDATA #IMPLIED
                      building (UWINNIPEG_DCE|UWINNIPEG_MAIN) "UWINNIPEG_MAIN"
                      originalDeveloper CDATA #FIXED "Khal Shariff">

那么,当我们想要添加更多 CD 时,我们最后的 CD 集合示例会发生什么?使用当前的 DTD,我们无法添加更多 CD 而不出现错误。尝试一下,看看结果。当您按我们之前的方式指定子元素(或元素)时,只能使用每个子元素的一个。对于 CD 集合来说这不太适合吧?我们可以使用称为后缀的东西来为 <!ELEMENT> 标签添加功能。后缀添加到指定子元素的末尾。可以使用 3 个主要后缀

  • (没有后缀):只能使用 1 个子元素。
  • (+):可以使用一个或多个元素。
  • (*):可以使用零个或多个元素。
  • ( ? ): 可以使用零个或一个元素。
使用 DTD 验证多个子元素
[编辑 | 编辑源代码]

因此,在我们的 CD 合集 XML 文件中,我们可以通过添加 + 后缀来添加更多 CD 到列表中。

<!ELEMENT cd_collection(cd+)>
使用更多内部格式化标签
[编辑 | 编辑源代码]

例如,粗体标签 B 在 DTD 中也被定义为元素,它们是可选的,如下所示

<ELEMENT notes (#PCDATA | b | i)*>
   <!ELEMENT b (#PCDATA)*>
   <!ELEMENT i (#PCDATA)*>
]>

_______________

<classList classNumber="303" building="UWINNIPEG_DCE" originalDeveloper="Khal Shariff">
 <student>
   <firstName>Kenneth
   </firstName>
   <lastName>Branaugh
   </lastName>
   <studentNumber>
   </studentNumber>
   <notes><b>Excellent </b>, Kenneth is doing well.
   </notes>
etc

BMEcat 案例研究

[编辑 | 编辑源代码]

最早将 XML 作为 B2B 交换格式的重大国家项目之一是由德国联邦物料管理、采购和物流协会 (BME) 与领先的德国公司(例如拜耳、宝马、SAP 和西门子)合作发起的。他们共同创建了产品目录交换标准。该项目被称为 BMEcat。该计划的结果是创建了用于描述产品目录和相关交易(新目录、产品数据更新和价格更新)的 DTD 集。

在电子商务领域运营的公司(供应商、采购公司和市场)交换的数据量越来越大。由于数据交换格式的多样性,他们很快就会达到极限。BMEcat 解决方案为以简洁明了的方式从各种数据格式传输目录数据创造了基础。这为推动德国通过互联网进行货物流通奠定了基础。使用 BMEcat 可以降低所有方的成本,因为可以使用标准接口。

基于 XML 的标准 BMEcat 已成功在许多项目中实施。如今,各种公司都在应用 BMEcat,并使用它在这个已建立的标准中交换他们的产品目录。


BMEcat 目录(版本 1.2)由以下主要元素组成:

CATALOG 此元素包含购物目录的基本信息,例如语言版本和有效期。BMEcat 要求每个目录中只有一门语言。

SUPPLIER 此元素包含目录供应商的标识和地址。BMEcat 要求每个目录中只有一家供应商。

BUYER 此元素包含目录接收方的姓名和地址。BMEcat 要求每个目录中最多有一个接收方。

AGREEMENT 此元素包含一个或多个与相应有效期相关的框架协议 ID。BMEcat 要求所有属于上述合同的目录价格。

CLASSIFICATION SYSTEM 此元素允许完整传输一个或多个分类系统,包括特征定义和关键词。

CATALOG GROUP SYSTEM 此元素源于版本 1.0。它主要用于传输树状结构,方便用户在目标系统(浏览器)中导航。

ARTICLE(自 2005 年起 PRODUCT) 此元素表示一个产品。它包含一组标准属性。

ARTICLE PRICE(自 2005 年起 PRODUCT PRICE) 此元素表示一个价格。与其他交换格式相比,对不同定价模型的支持非常强大。季节价格、国家价格、不同货币和不同有效期等都将得到支持。

ARTICLE FEATURE(自 2005 年起 PRODUCT FEATURE) 此元素允许传输特征值。您可以记录预定义的组特征或单个产品特征。

VARIANT 此元素允许列出产品变体,无需重复。但是,BMEcat 的变体仅适用于值的变化,导致文章 ID 发生变化。否则,任何其他属性(尤其是价格)都不能存在依赖关系。

MIME 此元素包含任意数量的附加文档,例如产品图片、数据表或网站。

ARTICLE REFERENCE(自 2005 年起 REFERENCE PRODUCT) 此元素允许在目录内以及目录之间进行交叉引用。这些引用可能仅用于映射产品捆绑包。

USER DEFINED EXTENSION 此元素支持传输超出 BMEcat 标准之外的数据。发送方和接收方必须协调一致。

您可以在 这里找到一个典型的 BMEcat 文件。

在线验证器
[编辑 | 编辑源代码]

GIYBF

格式良好且有效的 XML

[编辑 | 编辑源代码]

格式良好的 XML - 正确遵守 XML 语法规则的 XML 文档。

有效的 XML - 遵守 XML 模式规则(我们将在后面讨论)的 XML 文档。要使 XML 文档有效,它首先必须是格式良好的。


有效的 XML 文档必须是格式良好的。但是,格式良好的 XML 文档可能无效 - 换句话说,符合 XML 语法标准的格式良好的 XML 文档可能不符合 XML 模式的标准,因此将无效。

例如,考虑以下情况,您的 XML 文档包含以下内容(对于此模式):

  <city>
    <cityName>Boston</cityName>
    <country>United States</country>
    <adminUnit>Massachusetts</adminUnit>
  :
  :
  :
  </city>

注意,元素没有按照模式(cityName、adminUnit、country)的正确顺序出现。可以使用 XML 验证软件针对其声明的模式来验证 XML 文档 - 验证软件将捕获顺序错误。


使用 XML 编辑器

[编辑 | 编辑源代码]

查看章节 XML 编辑器以获取有关如何启动 XML 编辑器的说明。完成启动步骤后,可以将示例 XML 文档中的代码复制并粘贴到 XML 编辑器中。然后检查结果。XML 文档是否格式良好?XML 文档是否有效?(您需要复制并粘贴模式才能进行验证 - 我们将在下一节介绍模式)


XML 模式

[编辑 | 编辑源代码]

XML 模式是一个 XML 文档。XML 模式具有 .xsd 文件扩展名。

XML 模式用于通过提供 XML 文档遵循的模板来控制 XML 文档的结构和内容,以使其有效。它是关于如何构建 XML 文档以及指示 XML 文档组件(元素和属性 - 及其关系)的指南。XML 编辑器将检查 XML 文档以确保它符合其针对其编写的 XML 模式的规范 - 以确保它有效。

XML 模式增强了对数据传输的信心。有了模式,数据接收方可以确信数据符合预期。发送方和接收方对数据表示的含义有共同的理解。

因为 XML 模式是一个 XML 文档,所以您使用相同的语言 - 标准 XML 标记语法 - 其中包含特定于模式的元素和属性。


模式定义

  • 文档的结构
  • 元素
  • 属性
  • 子元素
  • 子元素的数量
  • 元素的顺序
  • 所有元素的名称和内容
  • 每个元素的数据类型

有关 XML 模式和以下参考列表的更多详细信息:常见 XML 模式基本数据类型、XML 模式元素摘要、数据类型模式限制和方面以及实例文档属性,请点击此维基百科链接 => https://wikibooks.cn/wiki/XML_Schema


模式引用

[编辑 | 编辑源代码]

这是 XML 文档中引用 XML 模式的部分。

图例 5:XML 文档的模式引用

  <tourGuide
      xmlns:xsi='http://www.w3.org/2001/XMLSchema-instance'
      xsi:noNamespaceSchemaLocation='city.xsd'>

这是我们在上一节中描述基本 XML 文档中的根元素时遗漏的部分。根元素 <tourGuide> 的附加属性引用了 XML 模式(它是 schemaLocation 属性)。

xmlns:xsi='http://www.w3.org/2001/XMLSchema-instance'  -  引用 W3C 模式实例命名空间
xsi:noNamespaceSchemaLocation='city.xsd'  -  引用 XML 模式文档 (city.xsd)

模式文档

[编辑 | 编辑源代码]

以下是一个使用我们的 TourGuide 模型的示例 XML 模式。在描述 XML 模式部分时,我们将参考它。

图例 6:城市实体的 XML 模式文档

  <?xml version="1.0" encoding="UTF-8"?>
  <xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema"
   elementFormDefault="unqualified">  
    <xsd:element name="tourGuide">
        <xsd:complexType>
            <xsd:sequence>
                <xsd:element name="city" type="cityDetails" minOccurs = "1" maxOccurs="unbounded" />
            </xsd:sequence>
        </xsd:complexType>
     </xsd:element>
     <xsd:complexType name="cityDetails">
        <xsd:sequence> 
             <xsd:element name="cityName" type="xsd:string"/>
             <xsd:element name="adminUnit" type="xsd:string"/>
             <xsd:element name="country" type="xsd:string"/>
             <xsd:element name="population" type="xsd:integer"/>
             <xsd:element name="area" type="xsd:integer"/>
             <xsd:element name="elevation" type="xsd:integer"/>
             <xsd:element name="longitude" type="xsd:decimal"/>
             <xsd:element name="latitude" type="xsd:decimal"/>
             <xsd:element name="description" type="xsd:string"/>
             <xsd:element name="history" type="xsd:string"/>
         </xsd:sequence>
     </xsd:complexType>
  </xsd:schema>
  <!--
    Note: Latitude and Longitude are decimal data types.
    The conversion is from the usual form (e.g., 50º 17' 35")
    to a decimal by using the formula degrees+min/60+secs/3600.
  -->


请记住,XML 模式本质上是一个 XML 文档,因此必须以序言开头,在模式的情况下,序言包括

  • XML 声明
  • 模式元素声明


XML 声明

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

模式元素声明

<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema" elementFormDefault="unqualified">

模式元素类似于根元素 - 它包含模式中的所有其他元素。

架构元素的属性包括

xmlns  -  XML 命名空间 - 描述架构中使用的 XML 元素和数据类型的网站的 URL。

您可以在此处找到有关命名空间的更多信息 => 命名空间

xmlns:xsd  -  所有带有“xsd”前缀的元素和属性都遵循给定命名空间中指定的词汇表。

elementFormDefault  -  目标命名空间中的元素要么需要,要么不需要用命名空间前缀限定。这在引用多个命名空间时最有用。在这种情况下,'elementFormDefault' 必须是 qualified,因为您必须指示每个元素使用哪个命名空间。如果您只引用一个命名空间,则 'elementFormDefault' 可以是 unqualified。也许,使用 qualified 作为默认值是最明智的,这样您就不会意外地忘记指示您正在引用的命名空间。

元素声明

[编辑 | 编辑源代码]

定义架构中的元素。

包括

  • 元素名称
  • 元素数据类型(可选)

基本元素声明格式:<xsd:element name="name" type="type">

简单类型
[编辑 | 编辑源代码]

声明元素,这些元素

  • 不包含子元素
  • 不包含属性

例如:<xsd:element name="cityName" type="xsd:string" />

默认值

如果元素没有分配值,则分配默认值。

例如:<xsd:element name="description" type="xsd:string" default="really cool place to visit!" />

固定值

定义为固定的属性必须为空或包含指定的固定值。不允许其他值。

例如:<xsd:element name="description" type="xsd:string" '''fixed="you must visit this place - it is awesome!"''' />

复杂类型
[编辑 | 编辑源代码]

声明元素,这些元素

  • 可以包含子元素
  • 可以包含属性

示例

1. 根元素 'tourGuide' 包含子元素 'city'。这里显示了它

无名复杂类型

     <xsd:element name="tourGuide">
        <xsd:complexType>
            <xsd:sequence>
                <xsd:element name="city" type="cityDetails" minOccurs = "1" maxOccurs="unbounded" />
            </xsd:sequence>
        </xsd:complexType>
     </xsd:element>

出现指示器:

  • minOccurs = 元素可以出现的最小次数(这里是 1 次)
  • maxOccurs = 元素可以出现的最大次数(这里是不限次数,'unbounded')


2. 父元素 'city' 包含许多子元素:'cityName'、'adminUnit'、'country'、'population' 等。为什么这个复杂的元素集不以以下行开头:<xsd:element name="city" type="cityDetails">?元素 'city' 已经在上面的复杂元素 'tourGuide' 中定义,并且被赋予了类型 'cityDetails'。此数据类型 'cityDetails' 在此处用于识别父元素 'city' 的子元素序列。

命名复杂类型 - 因此可以在架构的其他部分重复使用

   <xsd:complexType name="cityDetails">
        <xsd:sequence>
             <xsd:element name="cityName" type="xsd:string"/>
             <xsd:element name="adminUnit" type="xsd:string"/>
             <xsd:element name="country" type="xsd:string"/>
             <xsd:element name="population" type="xsd:integer"/>
             <xsd:element name="area" type="xsd:integer"/>
             <xsd:element name="elevation" type="xsd:integer"/>
             <xsd:element name="longitude" type="xsd:decimal"/>
             <xsd:element name="latitude" type="xsd:decimal"/>
             <xsd:element name="description" type="xsd:string"/>
             <xsd:element name="history" type="xsd:string"/>
         </xsd:sequence>
   </xsd:complexType>

<xsd:sequence> 标签表示子元素必须按照此处指定的顺序出现。

比较示例 XML 架构和示例 XML 文档 - 尝试观察代码中的模式以及 XML 架构如何设置 XML 文档。


3. 具有属性的元素也被指定为复杂类型。

a. 此 XML 文档行:<adminUnit class="state" name="Cayo" /> 将在 XML 架构中定义为

     <xsd:element name="adminUnit">
          <xsd:complexType>
               <xsd:attribute name="class" type="xsd:string" />
               <xsd:attribute name="name" type="xsd:string" />
          </xsd:complexType>
     </xsd:element>

b. 此 XML 文档行:<adminUnit class="state">Cayo</adminUnit> 将在 XML 架构中定义为

     <xsd:element name="adminUnit">
          <xsd:complexType>
               <xsd:simpleContent>
             		<xsd:extension base="xsd:string">
                                <xsd:attribute name="class" type="xsd:string" />
                        </xsd:extension>
	       </xsd:simpleContent>
          </xsd:complexType>
     </xsd:element>

属性声明

[编辑 | 编辑源代码]

属性声明用于复杂类型定义。我们在复杂类型元素的第三个示例中看到了一些属性声明。

<xsd:attribute name="class" type="xsd:string" />


数据类型声明

[编辑 | 编辑源代码]

这些包含在元素和属性声明中,如下所示: type=" "

常见 XML 架构数据类型

XML 架构具有许多内置数据类型。最常见的类型是

string 一个字符字符串
decimal 一个小数
integer 一个整数
boolean 值 true 或 false 或 1 或 0
date 一个日期,可以指定日期模式,例如 YYYY-MM-DD
time 一天中的时间,可以指定时间模式,例如 HH:MM:SS
dateTime 日期和时间组合
anyURI 如果元素将包含 URL


有关内置简单数据类型的完整列表,请参阅 http://www.w3.org/TR/xmlschema-2/#built-in-datatypes



使用 XML 编辑器 => XML 编辑器

此链接将带您了解如何启动 XML 编辑器。按照入门步骤操作后,您可以复制示例 XML 架构文档中的代码,并将其粘贴到 XML 编辑器中。然后检查您的结果。XML 架构是否格式正确?XML 架构是否有效?


XML 样式表(XSL)

[编辑 | 编辑源代码]

XML 样式表是一个 XML 文档。XML 样式表具有 .xsl 文件扩展名。

可扩展样式表语言 (XSL) 提供了一种方法来转换和格式化 XML 文档的内容以供显示。由于 XML 文档不包含浏览器理解的标签,例如 HTML 标签,因此浏览器在没有包含表示信息样式表的情况下无法呈现数据。通过将数据和表示逻辑分开,XSL 允许人们根据自己的不同需求和偏好查看数据。

XSL 转换语言 (XSLT) 用于将 XML 文档从一种形式转换为另一种形式,例如创建要在浏览器中查看的 HTML 文档。XSLT 样式表包含一组格式化指令,这些指令指示如何将 XML 文档的内容在浏览器中显示,其效果与级联样式表 (CSS) 对 HTML 的效果类似。可以使用不同的样式表创建相同数据的多个视图。样式表的输出不受限于浏览器。


在转换过程中,XSLT 会分析 XML 文档并将其转换为节点树 - 整个 XML 文档的层次表示。每个节点代表 XML 文档的一部分,例如元素、属性或一些文本内容。XSL 样式表包含预定义的“模板”,其中包含有关如何处理节点的指令。XSLT 将使用 match 属性将 XML 元素节点与模板相关联,并将它们转换为结果文档。

图 7:城市实体的 XML 样式表文档

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:output method="html"/> 
    <xsl:template match="/">
        <html>
            <head>
                <title>Tour Guide</title>
            </head>
            <body>
                <h2>Cities</h2>
                <xsl:apply-templates select="tourGuide"/>
            </body>
        </html>
    </xsl:template>
    <xsl:template match="tourGuide">
        <xsl:for-each select="city">
            <br/><xsl:value-of select="continentName"/><br/>
            <xsl:value-of select="cityName"/><br/>
            <xsl:text>Population: </xsl:text>
            <xsl:value-of select='format-number(population, "##,###,###")'/><br/>
            <xsl:value-of select="country"/>
            <br/>
        </xsl:for-each>     
    </xsl:template>
</xsl:stylesheet>


表 2-3 中 city.xsl 样式表的输出将如下所示

城市

欧洲
马德里
人口:3,128,600
西班牙

亚洲
上海
人口:18,880,000

中国


您会注意到样式表包含 HTML,用于通知媒体工具(网络浏览器)表示设计。如果您不了解 HTML,这可能看起来有点令人困惑。W3Schools 教程等在线资源可以帮助您了解您需要的基本知识 =>(https://w3schools.org.cn/html/default.asp)。

HTML 中包含了 XML,它提供了我们 XML 文档中包含的数据信息。样式表的 XML 指示将显示哪些信息以及如何显示。因此,HTML 创建一个显示,而 XML 在该显示中插入值。XSL 是将信息转换为表示形式的工具,但同时保留数据的含义。

伯乐曼的 XML 案例研究

德国伯乐曼公司是一家私营的媒体集团,业务遍及 56 个国家,涉及电视广播(RTL)、杂志(Gruner & Jahr)、书籍(兰登书屋)等领域。2005 年,其 89,000 名员工创造了 180 亿欧元的收入。

如此多元化的业务面临的一个主要问题是利用协同效应。管理层需要确保兰登书屋的员工不会浪费时间和金钱去重新发明 RTL 电视记者已经创造的东西。

因此,基于 IT 的知识管理承诺带来巨大的时间节省。因此,伯乐曼于 2002 年启动了一个名为 BeCom 的项目。BeCom 的目的是让不同的伯乐曼业务部门能够使用相同的数据来进行不同的媒体应用。XML 在这个项目中至关重要,因为它允许将数据(文档)与呈现(样式表)分离。因此,数据既可以进行统计分析,也可以修改以适应电视和报纸等不同的媒体。

例如,基于 XML 的统计数据管理使员工能够从 CBR(基于案例的推理)中受益。CBR 允许伯乐曼员工在搜索特定内容时从其他伯乐曼员工的先前搜索结果中获益,从而获得比孤立的研究结果更具语境的的信息。除了 XML 数据管理之外,伯乐曼的电视和图书部门还可以使用各种布局应用程序(如 3B2 或 QuarkXPress)在他们的特定媒体中应用这些优化后的数据。


序言

[edit | edit source]
  • XML 声明;
  • 样式表声明;
  • 命名空间声明;
  • 输出文档格式。
 <?xml version="1.0" encoding="UTF-8"?>
 <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
   <xsl:output method="html"/>


XML 声明

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


样式表和命名空间声明

     <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
  • 标识文档为 XSL 样式表;
  • 标识版本号;
  • 引用 W3C XSL 命名空间 - 描述架构中使用的 XML 元素和数据类型的网站的 URL。您可以在此处找到有关命名空间的更多信息 => Namespace。每次使用 xsl: 前缀时,它都会引用给定的命名空间。


输出文档格式

      <xsl:output method="html"/>

此元素指定输出文档的格式,并且必须是 <xsl:stylesheet> 的子元素。

模板

[edit | edit source]

<xsl:template> 元素用于创建描述如何显示元素及其内容的模板。上面,在 XSL 简介中,我们提到 XSL 将 XML 文档分解成节点并在单个节点上工作。这是通过模板完成的。XSL 中的每个模板都描述一个节点。要确定给定模板描述的节点,请使用“match”属性。赋予“match”属性的值称为模式。请记住:(节点树 - 整个 XML 文档的分层表示。每个节点表示 XML 文档的一部分,例如元素、属性或某些文本内容)。在节点树中出现分支的地方,都存在一个节点。<xsl:template> 定义了模板的开始,并包含在匹配特定节点时要应用的规则。


match 属性

   <xsl:template match="/">

此模板 match 属性将 XML 文档根 (/,即 XML 源文档的整个分支) 与 HTML 文档根相关联。此模板元素中包含在任何 HTML 文档开头都会找到的典型 HTML 标记。这些 HTML 将写入输出。XSL 会查找根匹配,然后输出浏览器可以理解的 HTML。

   <xsl:template match="tourGuide">

此模板 match 属性将元素“tourGuide”与该元素中描述的显示规则相关联。


元素

[edit | edit source]

特定于 XSL 的元素

XSL 元素 含义
(来自我们的示例 XSL)
<xsl:text> 打印在此元素标记之间找到的实际文本
<xsl:value-of> 此元素与“select”属性一起使用,用于查找所选节点的值并将其插入到输出中。
<xsl:for-each> 此元素与“select”属性一起使用,用于通过循环遍历所选节点集中的所有节点来处理重复的元素。
<xsl:apply-templates> 此元素将对节点或节点应用模板。如果它使用“select”属性,则该模板将仅应用于所选子节点,并且可以指定子节点的顺序。如果未使用“select”属性,则该模板将应用于当前节点及其所有子节点以及文本节点。

更多 XSL 元素 => https://w3schools.org.cn/xsl/xsl_w3celementref.asp

特定语言的验证和转换方法

[edit | edit source]

PHP XML Dom 验证方法

[edit | edit source]

使用 DOM DocumentObjectModel 验证 XML 以及 DTD DocumentTypeDeclaration 和服务器上的 PHP 语言以及更多 http://wiki.cc/php/Dom_validation

浏览器方法

[edit | edit source]

将此代码行放在您的 .xml 文档中,位于 XML 声明(序言)之后。

 <?xml-stylesheet type="text/xsl" href="tourGuide.xsl"?>

PHP XML 生产

[edit | edit source]
 <?php
 $xmlData = "";
 mysql_connect('localhost','root','')
 or die('Failed to connect to the DBMS');
 // make connection to database
 mysql_select_db('issd')
 or die('Failed to open the requested database');
 $result = mysql_query('SELECT * from students') or die('Query to like get the records failed');
 if (mysql_num_rows($result)<1){
    die ('');
 }
 $xmlString = "<classlist>\n";
 $xmlString .= "\t<student>";
 while ($row = mysql_fetch_array($result)) {
         $xmlString .=  "
          \t<firstName>
              ".$row['firstName']."
           </firstName>\n
            \t<lastName>
              ".$row['lastName']."
          \t</lastName>\n";         
      }
 $xmlString .= "</student>\n";
 $xmlString .= "</classlist>";
 echo $xmlString;
 $myFile = "classList.xml"; //any file
 $fh = fopen($myFile, 'w') or die("can't open file"); //create filehandler
 fwrite($fh, $xmlString); //write the data into the file
 fclose($fh); //ALL DONE!
 ?>

PHP XSLT 转换方法

[edit | edit source]

此方法适用于 PHP5 和 wampserver(最新版本)。请确保在 php.ini 文件中没有注释掉 *xsl*。

 <?php
 // Load the XML source
 $xml = new DOMDocument;
 $xml->load('tourguide.xml');
 $xsl = new DOMDocument;
 $xsl->load('tourguide.xsl');
 // Configure the transformer
 $proc = new XSLTProcessor;
 $proc->importStyleSheet($xsl); // attach the xsl rules
 echo $proc->transformToXML($xml);
 ?>


示例 1,在 PHP 本身中使用(使用 phpInfo() 函数检查 XSLT 扩展;如果需要,请启用)此示例可能会生成 XHTML。请注意,它可能会生成 XSL 定义的任何内容。

 <?php
 $xhtmlOutput = xslt_create();
 $args = array();
 $params = array('foo' => 'bar');
 $theResult = xslt_process(
                         $xhtmlOutput,
                         'theContentSource.xml',
                         'theTransformationSource.xsl',
                         null,
                         $args,
                         $params
                        );
 xslt_free($xhtmlOutput); // free that memory
 // echo theResult or save it to a file or continue processing (perhaps instructions)
 ?>

示例 2

 <?php
 if (PHP_VERSION >= 5) {
   // Emulate the old xslt library functions
   function xslt_create() {
       return new XsltProcessor();
   }
   function xslt_process($xsltproc,
                         $xml_arg,
                         $xsl_arg,
                          $xslcontainer = null,
                         $args = null,
                         $params = null) {
       // Start with preparing the arguments
       $xml_arg = str_replace('arg:', '', $xml_arg);
       $xsl_arg = str_replace('arg:', '', $xsl_arg);
       // Create instances of the DomDocument class
       $xml = new DomDocument;
       $xsl = new DomDocument;
       // Load the xml document and the xsl template
       $xml->loadXML($args[$xml_arg]);
       $xsl->loadXML($args[$xsl_arg]);
       // Load the xsl template
       $xsltproc->importStyleSheet($xsl);
       // Set parameters when defined
       if ($params) {
           foreach ($params as $param => $value) {
               $xsltproc->setParameter("", $param, $value);
           }
       }
       // Start the transformation
       $processed = $xsltproc->transformToXML($xml);
       // Put the result in a file when specified
       if ($xslcontainer) {
           return @file_put_contents($xslcontainer, $processed);
       } else {
           return $processed;
       }
   }
   function xslt_free($xsltproc) {
       unset($xsltproc);
   }
 }
 $arguments = array(
   '/_xml' => file_get_contents("xml_files/201945.xml"),
   '/_xsl' => file_get_contents("xml_files/convertToSql_new2.xsl")
 );
 $xsltproc = xslt_create();
 $html = xslt_process(
   $xsltproc,
   'arg:/_xml',
   'arg:/_xsl',
   null,
   $arguments
 );
 xslt_free($xsltproc);
 print $html;
 ?>

PHP 文件写入代码

[edit | edit source]
 $myFile = "testFile.xml"; //any file
 $fh = fopen($myFile, 'w') or die("can't open file"); //create filehandler
 $stringData = "<foo>\n\t<bar>\n\thello\n"; // get a string ready to write
 fwrite($fh, $stringData); //write the data into the file
 $stringData2 = "\t</bar>\n</foo>";
 fwrite($fh, $stringData2); //write more data into the file
 fclose($fh); //ALL DONE!

XML 颜色

[edit | edit source]

在您的样式表中使用:这些颜色可用于背景和字体

https://w3schools.org.cn/html/html_colors.asp

https://w3schools.org.cn/html/html_colorsfull.asp

https://w3schools.org.cn/html/html_colornames.asp


使用 XML 编辑器 => XML 编辑器

此链接将带您进入有关如何启动 XML 编辑器的说明。按照启动步骤操作后,您可以复制示例 XML 样式表文档中的代码并将其粘贴到 XML 编辑器中。然后检查您的结果。XML 样式表是否格式正确?


托马斯库克的 XML 案例研究

[edit | edit source]

作为全球领先的旅游公司和最广为人知的品牌,托马斯库克在整个旅游价值链中运营 - 包括航空公司、酒店、旅行社、旅游和入境代理,为全球所有市场细分的客户提供合适的产品。该集团拥有 11,000 多名员工,拥有 33 家旅行社,约 3,600 家旅行社,一支拥有 80 架飞机的机队,员工人数约为 26,000 人。托马斯库克在欧洲和海外的 616 个地点运营。该公司现在是欧洲第二大旅游集团,也是全球第三大旅游集团。

由于 Thomas Cook 销售其他公司的产品,范围从打包假期到汽车租赁,因此需要定期更改其在线宣传册。在 Thomas Cook 开始使用 XML 之前,它将信息以 HTML 格式存储,并且需要长达六周的时间才能将在线宣传册上线。XML 有助于在三天内完成这项工作。这有助于为 Thomas Cook 的所有现有和潜在客户及其分布在不同地理位置的各个机构提供更新的信息,而不是让他们等待六周才能获得新信息。

XML 允许 Thomas Cook 将内容信息存储在单个数据库中,该数据库可以根据需要重复使用。Thomascook.com 的内容经理 Gwyn Williams 说:“我们不想一直重复相同的内容,我们希望能够立即启用它。”“这带来了内部收益,例如能够将员工重新部署到更有价值的领域。”Thomascook.com 目前以 XML 格式存储了 65,000 页的宣传册和旅行指南信息以及在线杂志。

Thomas Cook 在相对较早的阶段就开始使用 XML。由于 Thomas Cook 拥有庞大的数据库,因此早期使用 XML 将对其有利。在某个时候,数据库将必须整合到 XML 中,据报道 XML 数据库比传统数据库速度更快,这使 Thomas Cook 比不使用 XML 的公司具有一定的竞争优势。

Thomas Cook 发现这可以带来可观的成本降低以及所有渠道信息的一致性。通过实施中央内容管理系统来促进宣传册制作和网页出版,他们已经将所有品牌和渠道的内容制作、维护和分发集中起来。

从上一章《XML 简介》中,您了解了数据交换的必要性以及 XML 在数据交换中的用途。在本章中,您进一步了解了三种主要的 XML 文件:XML 文档、XML 模式和 XML 样式表。您学习了每种类型的文件所需的正确文档。您学习了适用于所有 XML 文档的基本语法规则。您学习了如何整合三种类型的 XML 文档。并且您学习了“格式良好”文档和“有效”文档的定义和区别。通过点击“XML 编辑器”链接,您可以看到示例代码的结果,并学习如何使用 XML 编辑器。

下面是供进一步练习的习题和答案。祝您好运!


XML
SGML
Dan Connelly
RSS
XML Declaration
parent
child
sibling
element
attribute
*Well-formed XML
PCDATA

练习 1.

a)以上面的“tourguide”为例,创建一个根元素为“classlist”的 XML 文档。此 CLASSLIST 从单个实体 STUDENT 开始创建。任意数量的学生包含元素:firstname、lastname、emailaddress。

华夏公益教科书