`
747017186
  • 浏览: 331496 次
社区版块
存档分类
最新评论

一个 XSD 实例

    博客分类:
  • xml
 
阅读更多

一个 XSD 实例

本节会为您演示如何编写一个 XML 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>George Bush</orderperson>
 <shipto>
  <name>John Adams</name>
  <address>Oxford Street</address>
  <city>London</city>
  <country>UK</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 version="1.0" encoding="ISO-8859-1"?>

<shiporder orderid="889923"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:noNamespaceSchemaLocation="shiporder.xsd">

 <orderperson>George Bush</orderperson>

 <shipto>
  <name>John Adams</name>
  <address>Oxford Street</address>
  <city>London</city>
  <country>UK</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 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>

 

------------------------------------------------------------------------------------

 

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

分享到:
评论

相关推荐

    xsd解析实例创建表结构

    例如,如果XSD文件中有一个元素叫做`username`,数据类型为`string`,非空,那么对应的SQL语句可能是: ```sql CREATE TABLE 用户信息 ( username VARCHAR(255) NOT NULL ) ``` 对于复杂的数据结构,如嵌套元素...

    java生成xsd,xml示例

    以下是一个简单的XSD示例,对应上面的XML文档: ```xml ``` 在Java中生成XML文档,我们可以使用DOM(Document Object Model)、SAX(Simple API for XML)或者JAXB(Java Architecture for ...

    XML_Schema 教程 详细版

    #### 十七、一个XSD实例 实例展示如何使用上述元素和属性来定义一个完整的XML Schema。 #### 十八至二十、XSD字符串、日期及时间、数值数据类型 分别详细介绍了XML Schema中预定义的数据类型,如`string`、`date`...

    xml schema 教程

    以下是一个简单的 XSD 文件实例,用于定义书籍的信息: ```xml ``` #### XSD 字符串数据类型 XML Schema 定义了一系列字符串相关的数据类型,如 `xs:string`、`xs:normalizedString`、`xs:...

    xml-wsdl基础知识

    **3.10 一个XSD实例** - **3.10.1 XML文档** - 示例XML文档,展示了一个简单的客户订单。 - **3.10.2 创建一个XMLSchema** - 根据XML文档创建一个对应的XMLSchema。 - **3.10.3 分割Schema** - 将大型的Schema...

    关于Spring的spring-beans-xsd和tx-xsd aop-xsd等

    在该XSD中,你可以找到如`&lt;bean&gt;`、`&lt;alias&gt;`、`&lt;property&gt;`等元素的定义,它们允许你创建Bean实例,设置属性值,以及进行别名定义。通过这个XSD,开发人员可以在编写`beans.xml`文件时得到IDE的智能提示,提高编写...

    xml文件转xsd文件

    XML(eXtensible Markup Language)文件是一种...这个过程中涉及到XML解析、XSD设计、数据验证和Java对象的生成,是XML数据处理的一个重要环节。了解和掌握这一技能,对于提升软件开发效率和保证数据质量具有重要意义。

    Xsd的使用命令

    在文件名列表中,“decfg.xsd”是一个具体的XSD文件,很可能在博文中作为示例来讲解。这个文件可能是配置文件的模式定义,包含了对XML配置文件结构和数据类型的约束。开发者可以使用这个XSD文件来检查XML配置文件...

    XForms用schema(xsd)验证的一个简单的例子

    例如,假设`schema.xsd`中有一个名为`person`的元素,它期望包含一个`firstName`和`lastName`属性,且这些属性的数据类型为字符串。在`sample.xhtml`中,我们可以创建相应的输入字段,并通过`&lt;xforms:bind&gt;`元素将...

    XSD(Schema)教程

    XSD,全称为XML Schema Definition,是W3C(World Wide Web Consortium)制定的一种XML文档结构定义语言,用于规范和验证XML文档的结构和数据类型。它提供了比DTD(Document Type Definition)更为强大和灵活的XML...

    生成Xsd工具

    例如,当需要建立一个基于XML的数据交换格式时,可以先创建一个XML实例文档,然后使用该工具生成对应的XSD,确保所有参与数据交换的系统都遵循相同的结构规则。此外,开发Web服务时,XSD文件可以用来定义服务接口的...

    spring-cache.xsd+spring-encache.xsd

    而"spring-encache.xsd"可能是Spring与Ehcache集成的一个特定Schema,Ehcache是一个流行的Java缓存解决方案,常被Spring用来实现本地缓存。 描述中提到的"springmodules-ehcache.xsd"和"springmodules-cache.xsd...

    EMF XSD SDK

    这个SDK是Eclipse Modeling Framework (EMF) 的一个重要组成部分,特别适用于那些需要处理XML数据、构建基于XSD的模型或者实现MVC架构的开发者。 EMF是Eclipse IDE中的一个核心组件,主要用于构建和操作基于模型的...

    xml dtd xsd 标准格式

    XML(eXtensible Markup Language)是一种用于标记数据的语言,它允许用户自定义标签来描述数据,使得数据具有结构和语义。...通过提供的压缩包文件,你可以学习到具体的DTD和XSD实例,加深对这些概念的理解。

    xsd生成javaBean

    2. **配置**:创建一个Castor的配置文件(如`casting.xml`),指定需要转换的XSD文件和生成JavaBean的目标目录。配置文件可能包含其他高级设置,如命名策略、包名等。 3. **运行代码生成器**:使用Castor提供的...

    JAXB 利用xsd文件生成java类

    - **绑定配置**:通过在XSD文件中添加特殊的JAXB注解,或者创建一个独立的绑定文件(如`jaxb-bindings.xml`),可以自定义生成的Java类的特性,例如命名空间前缀、类名等。 - **生成的Java类**:生成的Java类通常...

    spring3.0的xsd文件.rar

    Spring 3.0是Spring框架的一个重要版本,它引入了许多新特性和改进,极大地提升了开发效率和灵活性。XSD(XML Schema Definition)文件在Spring框架中扮演着核心角色,它们定义了Spring配置文件的结构和规则,使得...

    delphiXE2_XSD用法

    1. **导入XSD文件**:首先,你需要一个有效的XSD文件。将XSD文件导入到Delphi项目中,可以通过“File” -&gt; “New” -&gt; “Other” -&gt; “XML Tools” -&gt; “XML Data Binding Wizard”打开向导。 2. **选择XSD文件**:...

    Xsd转换xml

    为了确保XML文档遵循一定的规则,我们使用XSD来创建一个模式,这个模式描述了XML文档应该如何构建,包括元素、属性、数据类型以及它们之间的关系。一旦有了XSD,我们就可以根据这个模式验证XML文档,确保其符合规范...

    使用jaxb根据xsd生成xml文档

    这个XSD定义了一个名为`person`的元素,包含一个字符串类型的`name`子元素和一个整型的`age`子元素。 **步骤2:生成Java类** 有了XSD文件后,JAXB可以自动生成对应的Java类。使用`xjc`命令行工具(通常随Java SDK...

Global site tag (gtag.js) - Google Analytics