zoukankan      html  css  js  c++  java
  • XSD实例

    XSD实例

    本章会学习到如何编写一个 XML Schema以及编写schema的不同方法

    本章内容

    • XML文档

    • XML Schema

      • 分割Schema

      • 使用指定的类型(Named Types)


    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>
    <!--
    要求找到以下几点:
    1.根元素
    2.子元素
    3.属性
    4.子元素包含的元素
    5.所包含的元素出现的次数
    6.可选元素和必选元素
    -->

    分析:

    • 根元素:shiporder

    • 根元素属性:orderid

    • 子元素:"orderperson"、"shipto" 、 "item"其中item出现了两次

    • 在子元素item中有一个可选元素<note>

    • xmlns:xsi=" http://www.w3.org/2001/XMLSchema-instance ",告知XML解析器根据某个 schema 来验证此文档

    • xsi:noNamespaceSchemaLocation="shiporder.xsd" 规定了 schema 的位置

    (它与 "shiporder.xml" 处于相同的文件夹)


    根据上面的XML转成XML Schema

    步骤:

    • 使用标准的命名空间 (xs),相关联的 URI 是 Schema 的语言定义(Schema language definition),其标准值是 http://www.w3.org/2001/XMLSchema

      • <?xml version="1.0" encoding="ISO-8859-1" ?>
        <xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
        ...
        </xs:schema>
    • 定义 "shiporder" 元素。此元素拥有一个属性,其中包含其他的元素---复合元素

    • "shiporder" 元素的子元素被 xs:sequence 元素包围,定义了子元素的次序

      • <xs:element name="shiporder">
         <xs:complexType>
           <xs:sequence>
            ...
           </xs:sequence>
         </xs:complexType>
        </xs:element>
    • 把 "orderperson" 元素定义为简易类型(这是因为它不包含任何属性或者其他的元素)。类型 (xs:string)

      • <xs:element name="orderperson" type="xs:string"/>
    • 把两个元素定义为复合类型:"shipto" 和 "item"

      • <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>
    • 定义 "item" 元素,在 "shiporder" 元素内部出现多次,"note" 元素是可选元素

      • <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---属性的声明必须被置于最后

      • <xs:attribute name="orderid" type="xs:string" use="required"/>
    • 组合起来

      • <?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 属性来引用它们

    <?xml version="1.0" encoding="ISO-8859-1" ?>
    <xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
    
    <!-- definition of simple elements -->
    <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"/>
    
    <!-- definition of attributes -->
    <xs:attribute name="orderid" type="xs:string"/>
    
    <!-- definition of complex elements -->
    <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 属性来指向它们

    <?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">
    <xs:simpleType name="orderidtype">
      <xs:restriction base="xs:string">
        <xs:pattern value="[0-9]{6}"/>
      </xs:restriction>
    </xs:simpleType>
    It's a lonely road!!!
  • 相关阅读:
    Java 第十一届 蓝桥杯 省模拟赛 梅花桩
    Java 第十一届 蓝桥杯 省模拟赛 梅花桩
    Java 第十一届 蓝桥杯 省模拟赛 梅花桩
    Java 第十一届 蓝桥杯 省模拟赛 元音字母辅音字母的数量
    Java 第十一届 蓝桥杯 省模拟赛 元音字母辅音字母的数量
    Java 第十一届 蓝桥杯 省模拟赛 元音字母辅音字母的数量
    Java 第十一届 蓝桥杯 省模拟赛 最大的元素距离
    Java 第十一届 蓝桥杯 省模拟赛 递增序列
    Java 第十一届 蓝桥杯 省模拟赛 递增序列
    Java 第十一届 蓝桥杯 省模拟赛 最大的元素距离
  • 原文地址:https://www.cnblogs.com/JunkingBoy/p/14658462.html
Copyright © 2011-2022 走看看