今天学习了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: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>
<!--书籍名称元素定义-->
<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!