XML学习之 schema

来源:互联网 发布:2016年开淘宝店怎么样 编辑:程序博客网 时间:2024/04/28 19:54

     今天学习了XML的schema,感觉schema的功能可以对文本进行相应的校验, 功能较dtd强大很多,但是难度也大很多。

  首先将dtd与XML做一个简单的比较:
  1. dtd不遵循xml语法
  2. dtd数据类型有限
  3. dtd不可扩展
  4. dtd不支持命名空间。
 
     刚完成的一个XML schema的习题
 

       综合练习:书藉信息表

字段名

数据类型和约束

书藉编号

唯一 二个数字开头-三个字母结尾 /必需 作为属性

书藉名称

1---30个字符/必需

名称类型

作为书藉名称的属性 中文名、英文名  枚举/必需

书藉类型

武侠小说、言情小说、软件编程、数据库入门 枚举/必需

书藉价格

1-10000  必需

价格类型

作为书藉价格的属性  人民币、美元、欧元、日元

作者

原著

1---100个字符/必需可以多个

翻译

1---100个字符/可以多个

性别

作为原著和翻译的属性  男、女 枚举/必需

国籍

作为原著和翻译的属性 中国、美国、荷兰

枚举/必需

 
做题思路步骤如下:
1、 根据题意对所有的元素进行分类,分为简单类型元素与复杂类型元素两大类。 简单元素类型
是指元素开始之间只有文本而没有属性的元素。
2、 再将简单类型元素分成对文本没有限制于对文本有限制的两类。 对文本类型有限制的简单元素类型
要通过自定义简单类型做相应的限制约束。
3、 对复杂类型的元素进行分类, 分为含有子元素的元素; 含有属性、子元素的元素; 含有属性
、文本的元素; 含有属性的空元素共四类。
最后对照上述分类再分别进行相应的处理即OK。建议构造schema的xsd文件时按从小到大,从简单到复杂的
顺序进行构造。
 
现在草纸上画好结构草图,然后编码.xsd文件:
<?xml version="1.0" encoding="UTF-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified" attributeFormDefault="unqualified">
<!--名称类型-->
<xs:attribute name="nameType">
 <xs:simpleType>
  <xs:restriction base="xs:string">
   <xs:enumeration value="中文名"/>
   <xs:enumeration value="英文名"/>
  </xs:restriction>
 </xs:simpleType>
</xs:attribute>
<xs:simpleType name="bookNameRistriction">
 <xs:restriction base="xs:string">
  <xs:minLength value="1"/>
  <xs:maxLength value="30"/>
 </xs:restriction>
</xs:simpleType>
 <!--书籍名称元素定义-->
 
 <xs:element name="bookName">
  <xs:complexType>
   <xs:simpleContent>
    <xs:extension base="bookNameRistriction">
    <xs:attribute ref="nameType" use="required"/>
    </xs:extension>
   </xs:simpleContent>
  </xs:complexType>
 </xs:element>
 
 <!--定义书籍类型-->
 <xs:element name="bookType">
  <xs:simpleType>
   <xs:restriction base="xs:string">
    <xs:enumeration value="武侠小说"/>
    <xs:enumeration value="言情小说"/>
    <xs:enumeration value="软件编程"/>
    <xs:enumeration value="数据库入门"/>
   </xs:restriction>
  </xs:simpleType>
 </xs:element>
 
 <!--定义价格类型属性-->
 <xs:attribute name="priceType">
  <xs:simpleType>
   <xs:restriction base="xs:string">
   <xs:enumeration value="日元"/>
   <xs:enumeration value="美元"/>
   <xs:enumeration value="人民币"/>
   </xs:restriction>
  </xs:simpleType>
 </xs:attribute>
 <!--定义书籍价格-->
 <xs:simpleType name="priceRestriction">
  <xs:restriction base="xs:float">
   <xs:minInclusive value="1"/>
   <xs:maxInclusive value="10000"/>
  </xs:restriction>
 </xs:simpleType>
 <xs:element name="bookPrice">
  <xs:complexType>
   <xs:simpleContent>
    <xs:extension base="priceRestriction">
    <xs:attribute ref="priceType" use="required"/>
    </xs:extension>
   </xs:simpleContent>
  </xs:complexType>
 </xs:element>
 
 <!--定义属性组-->
 <xs:attributeGroup name="authorAttribute">
  <xs:attribute name="sex" use="required">
   <xs:simpleType>
    <xs:restriction base="xs:string">
    <xs:enumeration value="男"/>
    <xs:enumeration value="女"/>
    </xs:restriction>
   </xs:simpleType>
  </xs:attribute>
  <xs:attribute name="national" use="required">
   <xs:simpleType>
    <xs:restriction base="xs:string">
    <xs:enumeration value="中国"/>
    <xs:enumeration value="美国"/>
    </xs:restriction>
   </xs:simpleType>
  </xs:attribute>
 </xs:attributeGroup>
 
 <xs:simpleType name="authorNameLength">
  <xs:restriction base="xs:string">
   <xs:minLength value="1"/>
   <xs:maxLength value="100"/>
  </xs:restriction>
 </xs:simpleType>
 <!--定义原著-->
 <xs:element name="originalAuthor">
  <xs:complexType>
   <xs:simpleContent>
    <xs:extension base="authorNameLength">
     <xs:attributeGroup ref="authorAttribute"/>
    </xs:extension>
   </xs:simpleContent>
  </xs:complexType>
 </xs:element>
 
 <!--定义翻译-->
 <xs:element name="translator">
  <xs:complexType>
   <xs:simpleContent>
    <xs:extension base="authorNameLength">
     <xs:attributeGroup ref="authorAttribute"/>
    </xs:extension>
   </xs:simpleContent>
  </xs:complexType>
 </xs:element>
 <!--定义作者-->
 <xs:element name="author">
  <xs:complexType>
   <xs:sequence>
   <xs:element ref="originalAuthor" maxOccurs="unbounded"/>
   <xs:element ref="translator" minOccurs="0" maxOccurs="unbounded"/>
   </xs:sequence>
  </xs:complexType>
 </xs:element>
 
 <!--定义书籍编号属性-->
 <xs:attribute name="bookId">
  <xs:simpleType>
   <xs:restriction base="xs:string">
   <xs:pattern value="[0-9]{2}[a-zA-Z]{3}"/>
   </xs:restriction>
  </xs:simpleType>
 </xs:attribute>
 
 <xs:element name="book">
  <xs:complexType>
   <xs:sequence>
   <xs:element ref="bookName"/>
   <xs:element ref="bookType"/>
   <xs:element ref="bookPrice"/>
   <xs:element ref="author"/>
   </xs:sequence>
   <xs:attribute ref="bookId" use="required"/>
  </xs:complexType>
 </xs:element>
 
 <xs:element name="books">
  <xs:complexType>
   <xs:sequence>
    <xs:element ref="book" maxOccurs="unbounded"/>
   </xs:sequence>
  </xs:complexType>
  <xs:unique name="uniqueBook">
   <xs:selector xpath="book"></xs:selector>
   <xs:field xpath="@bookId"></xs:field>
  </xs:unique>
 </xs:element>
</xs:schema>
最后再新建一个.xml文件,并在其中导入.xsd文件, 写好相应的xml文件OK!
原创粉丝点击