`
marb
  • 浏览: 422270 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

schema学习系列四: schema实例

阅读更多

XML 文档

让我们看看这个名为 "shiporder.xml" 的 XML 文档:

<?xml version="1.0" encoding="ISO-8859-1"?>

<shiporder orderid="889923"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:noNamespaceSchemaLocation="shiporder.xsd">
 <orderperson>John Smith</orderperson>
 <shipto>
  <name>Ola Nordmann</name>
  <address>Langgt 23</address>
  <city>4000 Stavanger</city>
  <country>Norway</country>
 </shipto>
 <item>
  <title>Empire Burlesque</title>
  <note>Special Edition</note>
  <quantity>1</quantity>
  <price>10.90</price>
 </item>
 <item>
  <title>Hide your heart</title>
  <quantity>1</quantity>
  <price>9.90</price>
 </item>
</shiporder>
 

上面的XML文档包括根元素 "shiporder",其中包含必须名为 "orderid" 的属性。"shiporder" 元素包含三个不同的子元素:"orderperson"、"shipto" 以及 "item"。"item" 元素出现了两次,它含有一个 "title"、一个可选 "note" 元素、一个 "quantity" 以及一个 "price" 元素。

上面这一行 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance",告知XML解析器根据某个 schema 来验证此文档。这一行:xsi:noNamespaceSchemaLocation="shiporder.xsd" 规定了 schema 的位置(在这里,它与 "shiporder.xml" 处于相同的文件夹)。

创建一个 XML Schema

现在,我们需要为上面这个 XML 文档创建一个 schema。

我们可以通过打开一个新的文件来开始,并把这个文件命名为 "shiporder.xsd"。要创建schema,我们仅仅需要简单地遵循 XML 文档中的结构,定义我们所发现的每个元素。首先我们开始定义一个标准的 XML 声明:

<?xml version="1.0" encoding="ISO-8859-1" ?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
...
...


</xs:schema>
 

在上面的 schema 中,我们使用了标准的命名空间 (xs),与此命名空间相关联的 URI 是 Schema 的语言定义(Schema language definition),其标准值是 http://www.w3.org/2001/XMLSchema。

接下来,我们需要定义 "shiporder" 元素。此元素拥有一个属性,其中包含其他的元素,因此我们将它认定为复合类型。"shiporder" 元素的子元素被 xs:sequence 元素包围,定义了子元素的次序:

<xs:element name="shiporder">
 <xs:complexType>
  <xs:sequence>
  ...
  ...
  </xs:sequence>
  ...
 </xs:complexType>
</xs:element>
 

然后我们需要把 "orderperson" 元素定义为简易类型(这是因为它不包含任何属性或者其他的元素)。类型 (xs:string) 的前缀是由命名空间的前缀规定的,此命名空间与指示预定义的 schema 数据类型的 XML schema 相关联:

<xs:element name="orderperson" type="xs:string"/> 

接下来,我需要把两个元素定义为复合类型:"shipto" 和 "item"。我们从定义 "shipto" 元素开始:

<xs:element name="shipto">
 <xs:complexType>
  <xs:sequence>
   <xs:element name="name" type="xs:string"/>
   <xs:element name="address" type="xs:string"/>
   <xs:element name="city" type="xs:string"/>
   <xs:element name="country" type="xs:string"/>
  </xs:sequence>
 </xs:complexType>
</xs:element> 

通过 schema,我们可使用 maxOccurs 和 minOccurs 属性来定义某个元素可能出现的次数。maxOccurs 定义某元素出现次数的最大值,而 minOccurs 则定义某元素出现次数的最小值。maxOccurs 和 minOccurs 的默认值都是 1!

现在,我们可以定义 "item" 元素了。这个元素可在 "shiporder" 元素内部出现多次。这是通过把 "item" 元素的 maxOccurs 属性的值设定为 "unbounded" 来实现的,这样 "item" 元素就可出现创作者所希望的任意多次。请注意,"note" 元素是可选元素。我们已经把此元素的 minOccurs 属性设定为 0 了:

<xs:element name="item" maxOccurs="unbounded">
 <xs:complexType>
  <xs:sequence>
   <xs:element name="title" type="xs:string"/>
   <xs:element name="note" type="xs:string" minOccurs="0"/>
   <xs:element name="quantity" type="xs:positiveInteger"/>
   <xs:element name="price" type="xs:decimal"/>
  </xs:sequence>
 </xs:complexType>
</xs:element> 

现在,我们可以声明 "shiporder" 元素的属性了。由于这是一个必选属性,我们规定 use="required"。

注释: 此属性的声明必须被置于最后:

<xs:attribute name="orderid" type="xs:string" use="required"/> 

这是这个名为 "shiporder.xsd" 的 schema 文件的文档清单:

<?xml version="1.0" encoding="ISO-8859-1" ?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">

<xs:element name="shiporder">
 <xs:complexType>
  <xs:sequence>
   <xs:element name="orderperson" type="xs:string"/>
   <xs:element name="shipto">
    <xs:complexType>
     <xs:sequence>
      <xs:element name="name" type="xs:string"/>
      <xs:element name="address" type="xs:string"/>
      <xs:element name="city" type="xs:string"/>
      <xs:element name="country" type="xs:string"/>
     </xs:sequence>
    </xs:complexType>
   </xs:element>
   <xs:element name="item" maxOccurs="unbounded">
    <xs:complexType>
     <xs:sequence>
      <xs:element name="title" type="xs:string"/>
      <xs:element name="note" type="xs:string" minOccurs="0"/>
      <xs:element name="quantity" type="xs:positiveInteger"/>
      <xs:element name="price" type="xs:decimal"/>
     </xs:sequence>
    </xs:complexType>
   </xs:element>
  </xs:sequence>
  <xs:attribute name="orderid" type="xs:string" use="required"/>
 </xs:complexType>
</xs:element>

</xs:schema> 

分割 Schema

前面的设计方法非常容易,但当文档很复杂时却难以阅读和维护。

接下来介绍的设计方法基于首先对所有元素和属性的定义,然后再使用 ref 属性来引用它们。

这是用新方法设计的 schema 文件:

<?xml version="1.0" encoding="ISO-8859-1" ?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">

<!-- 简易元素的定义 -->
<xs:element name="orderperson" type="xs:string"/>
<xs:element name="name" type="xs:string"/>
<xs:element name="address" type="xs:string"/>
<xs:element name="city" type="xs:string"/>
<xs:element name="country" type="xs:string"/>
<xs:element name="title" type="xs:string"/>
<xs:element name="note" type="xs:string"/>
<xs:element name="quantity" type="xs:positiveInteger"/>
<xs:element name="price" type="xs:decimal"/>

<!-- 属性的定义 -->
<xs:attribute name="orderid" type="xs:string"/>

<!-- 复合元素的定义 -->
<xs:element name="shipto">
 <xs:complexType>
  <xs:sequence>
   <xs:element ref="name"/>
   <xs:element ref="address"/>
   <xs:element ref="city"/>
   <xs:element ref="country"/>
  </xs:sequence>
 </xs:complexType>
</xs:element>
<xs:element name="item">
 <xs:complexType>
  <xs:sequence>
   <xs:element ref="title"/>
   <xs:element ref="note" minOccurs="0"/>
   <xs:element ref="quantity"/>
   <xs:element ref="price"/>
  </xs:sequence>
 </xs:complexType>
</xs:element>

<xs:element name="shiporder">
 <xs:complexType>
  <xs:sequence>
   <xs:element ref="orderperson"/>
   <xs:element ref="shipto"/>
   <xs:element ref="item" maxOccurs="unbounded"/>
  </xs:sequence>
  <xs:attribute ref="orderid" use="required"/>
 </xs:complexType>
</xs:element>

</xs:schema> 

使用指定的类型(Named Types)

第三种设计方法定义了类或者类型,这样使我们有能力重复使用元素的定义。具体的方式是:首先对简易元素和复合元素进行命名,然后通过元素的 type 属性来指向它们。

这是利用第三种方法设计的 schema 文件 ("shiporder.xsd"):

<?xml version="1.0" encoding="ISO-8859-1" ?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">

<xs:simpleType name="stringtype">
 <xs:restriction base="xs:string"/>
</xs:simpleType>

<xs:simpleType name="inttype">
 <xs:restriction base="xs:positiveInteger"/>
</xs:simpleType>

<xs:simpleType name="dectype">
 <xs:restriction base="xs:decimal"/>
</xs:simpleType>

<xs:simpleType name="orderidtype">
 <xs:restriction base="xs:string">
  <xs:pattern value="[0-9]{6}"/>
 </xs:restriction>
</xs:simpleType>

<xs:complexType name="shiptotype">
 <xs:sequence>
  <xs:element name="name" type="stringtype"/>
  <xs:element name="address" type="stringtype"/>
  <xs:element name="city" type="stringtype"/>
  <xs:element name="country" type="stringtype"/>
 </xs:sequence>
</xs:complexType>

<xs:complexType name="itemtype">
 <xs:sequence>
  <xs:element name="title" type="stringtype"/>
  <xs:element name="note" type="stringtype" minOccurs="0"/>
  <xs:element name="quantity" type="inttype"/>
  <xs:element name="price" type="dectype"/>
 </xs:sequence>
</xs:complexType>

<xs:complexType name="shipordertype">
 <xs:sequence>
  <xs:element name="orderperson" type="stringtype"/>
  <xs:element name="shipto" type="shiptotype"/>
  <xs:element name="item" maxOccurs="unbounded" type="itemtype"/>
 </xs:sequence>
 <xs:attribute name="orderid" type="orderidtype" use="required"/>
</xs:complexType>

<xs:element name="shiporder" type="shipordertype"/>

</xs:schema>
 

restriction 元素显示出数据类型源自于 W3C XML Schema 命名空间的数据类型。因此,下面的片段也就意味着元素或属性的值必须是字符串类型的值:

<xs:restriction base="xs:string"> 

restriction 元素常被用于向元素施加限制。请看下面这些来自以上 schema 的片段:

<xs:simpleType name="orderidtype">
 <xs:restriction base="xs:string">
  <xs:pattern value="[0-9]{6}"/>
 </xs:restriction>
</xs:simpleType>
 

这段代码指示出,元素或属性的值必须为字符串,并且必须是连续的六个字符,同时这些字符必须是 0-9 的数字。

分享到:
评论

相关推荐

    XML基础实例 Schema

    8. **第二章 Schema**:这个文件名可能指的是学习XML Schema的一个章节,该章节可能详细讲解了Schema的某一部分,如数据类型的扩展、限制、枚举值、模式匹配等。 总之,XML基础实例和Schema是XML编程中的核心概念。...

    JSON Schema验证规范-中文版

    #### 四、断言与JSON实例的基本类型 断言用于验证JSON实例的基本类型是否正确。例如: - `type`:指定实例的类型,如`object`、`array`等。 - `enum`:指定实例值必须从预定义的枚举列表中选取。 - `const`:指定...

    SAP HCM schema:考勤项目实例.pdf

    项目考勤schema规则实例,可以作为参考和借鉴。 项目考勤schema规则实例,可以作为参考和借鉴。 项目考勤schema规则实例,可以作为参考和借鉴。 项目考勤schema规则实例,可以作为参考和借鉴。 项目考勤schema规则...

    XMLschema快速入門

    ### XML Schema 快速...通过以上步骤,读者可以了解到如何使用 XML Schema 来定义 XML 数据结构,并通过一个简单的实例学习如何实现 XML 分层的效果。希望这个指南能够帮助初学者更好地理解和应用 XML Schema 技术。

    JSON Schema 生成库——json-schema-inferrer(java版).rar

    `json-schema-inferrer`是针对Java平台的一个工具库,它的主要功能是从JSON实例数据生成对应的JSON Schema,方便开发者快速构建符合规范的数据模型。 `json-schema-inferrer`库的使用可以分为以下几个关键知识点: ...

    XML Schema教程

    - **XSD 实例**:具体的应用实例,展示如何在实际场景中使用 XML Schema。 - **数据类型**:XML Schema 定义了大量的预定义数据类型,包括但不限于: - **XSD 字符串**:用于表示文本字符串。 - **XSD 日期**:...

    xml schema实例

    总结来说,XML Schema实例通过使用简单类型、复合类型、元素定义和属性定义,为XML文档提供了强大的结构化规范。这不仅有助于确保文档的一致性,还使得数据交换和验证变得更加方便。在实际应用中,开发者可以根据...

    xml Schema学习

    4. **模式组件**:XML Schema由一系列模式组件构成,包括元素、属性、类型、组、键和引用等,这些组件可以组合创建复杂的结构。 5. **约束和验证**:通过XML Schema,我们可以设置元素数量、顺序、内容模型等方面的...

    XML Schema

    #### 四、XML Schema高级特性 - **预定义简单数据类型**: - **字符串数据类型**:包括`string`、`normalizedString`等。 - **数值数据类型**:如`integer`、`decimal`等。 - **日期和时间数据类型**:如`date`...

    JSON-Schema定义规范

    JSON Schema本质上也是一个JSON文档,它定义了一个JSON实例应该遵循的模式。一个基本的JSON Schema包含以下关键元素: - **Type**:定义了数据的基本类型(例如,object、array、string等)。 - **Properties**:...

    理解XML Schema XML Schema进阶

    XML Schema是目前国际标准的XML建模工具,本文将对XML Schema进行详细的介绍,帮助读者初步掌握XML Schema的使用方法和XML Schema文档实例的具体语义。 1. 命名空间的使用 XML Schema中命名空间的使用是非常重要的...

    XML_Schema 教程 详细版

    **基础知识需求**:在深入学习XML Schema之前,建议读者具备以下基础知识: - HTML/XHTML - XML及其命名空间 - 对DTD有基本理解 **XML Schema 功能**: - **元素定义**:明确哪些元素可以在文档中出现。 - **属性...

    SCHEMA 官方文档 官方例子

    - **实例解析**:通过实例展示如何使用SCHEMA创建XML Schema文件。 - **错误处理**:讲解在处理XML文档时可能遇到的问题及解决方法。 5. **官方例子**:"Schema 教程.doc" 和 "万维网联合会Schema示例.doc" 这两...

    JSON Schema 校验库——json-schema-validator(java版本).rar

    然后,可以创建一个`JsonSchemaFactory`实例,加载JSON Schema文件,接着使用`validate()`方法来检验JSON数据。例如: ```java import com.github.fge.jsonschema.core.exceptions.ProcessingException; import ...

    schema学习笔记

    以下是一个Schema实例,定义了一个名为`编号类型`的简单类型和一个名为`商品类型`的复杂类型: ```xml &lt;xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified" ...

    Schema学习

    这篇博文链接(已提供但无法直接访问)可能提供了关于Schema的深入讨论和实例,可能涵盖了Schema的基本概念、设计原则以及在实际项目中的应用。 **Schema基础知识** 1. **基本概念**: - **数据库Schema**:是...

    最简单的schema文档.doc

    在创建最简单的XML Schema文档时,我们通常会从定义一个根元素开始,这个根元素将对应于XML实例文档中的根元素。例如,考虑下面的XML实例文档`hello.xml`: ```xml &lt;greeting&gt;Hello World!! ``` 对于这样一个简单...

    day38 day38 06-MyEclipse配置Schema约束

    "day38 day38 06-MyEclipse配置Schema约束"这个标题指的是一个关于如何在MyEclipse中配置XML Schema约束的学习教程。在Java企业级开发中,XML文件常用于配置Spring框架的beans,因此这个主题对于理解和管理Java应用...

    schema相关知识压缩包

    压缩包中的“schema”文件可能包含了更多详细的Schema知识,包括教程、实例代码和解析工具。建议通过阅读这些资料,深入了解不同领域的Schema应用,并实践操作以巩固理论知识。 了解并熟练掌握Schema对于数据管理...

    (网页)Schema 教程

    它提供了详细的文档和教程,帮助开发者了解各种Schema类型及其属性,还有实例供参考和实践。通过W3School的学习,你可以掌握如何有效地将Schema应用到你的网页中,提升网站的可发现性和用户体验。 总的来说,Schema...

Global site tag (gtag.js) - Google Analytics