1. 什么是schema约束?优势在哪?
XML的约束有两种,分别是dtd约束和schema约束。因为dtd约束有很大的局限性,所以我们通常都使用schema约束。
优势:
- XML schema符合XML语法结构,并且对名称空间有很好的支持性。dtd不可扩展并且不支持名称空间。
- schema约束比dtd约束支持的数据类型更多,并且支持用户自己定义新的数据类型。dtd只支持简单的数据类型。
- DOM和SAX等xml API更容易解析 xml schema文件。
- schema的约束能力更强大,可以对xml实例文档做出细致的语义限制。
2. XML schema约束开发
XML Schema 文件自身就是XML文件,但他的扩展名通常为.xsd。和xml文件一样,xml schema文档也必须要有一个根节点,并且这个根节点就是schema。
<1>引入W3C的名称
在根节点上,使用属性xmls,这个属性是xml的名称空间(namespace)。xmlns="http://www.w3.org/2001/XMLSchema"
所谓的namespace(名称空间)就是 在编写完XML约束文档后,将这个文件中声明的元素绑定到一个URI地址上,而这个URI地址也就是名称空间。以后在XML文件中可以通过URL来引用绑定名称空间来的元素。
在XML Schema中,每个约束模式文档都可以被赋以一个唯一的名称空间,名称空间用URI(Uniform Resource Identifier:统一资源标识符)来表示。
<?xml version="1.0" encoding="UTF-8"?>
<!--在根节点schema上引入xmlns-->
<schema xmlns="http://www.w3.org/2001/XMLSchema">
</schema>
<2>编写元素其子元素
* 定义元素
* <element name="书架"></element>
* 判断是否是复杂还是简单的元素
* 如果是简单 在element有属性 type="数据的类型"
* 如果是复杂
* 声明标签是复杂的元素 <complexType>
* 子元素之间的关系 <sequence>
* 起名:targetNamespace 目标名称空间(起名)
* 值是任意的:http://www.itcast.cn/1110
* elementFormDefault :
* qualified(使用) :质量好的
* unqualified :质量不好的
* 编写属性
* <attribute name="出版社" type="string" use="required" ></attribute>
* name 属性名称
* type 属性类型
* user 属性约束
例如:
<?xml version="1.0" encoding="UTF-8"?>
<schema xmlns="http://www.w3.org/2001/XMLSchema" targetNamespace="http://www.itcast.cn/1110" elementFormDefault="qualified">
<!-- 复杂元素 -->
<element name="书架">
<!-- 复杂元素 -->
<complexType>
<!-- 有顺序的 -->
<sequence maxOccurs="unbounded">
<element name="书">
<!-- 复杂的元素 -->
<complexType>
<!-- 有顺序的 -->
<sequence>
<!-- 简单元素 -->
<element name="书名" type="string"></element>
<element name="作者" type="string"></element>
<element name="售价" type="double"></element>
<element name="简介" type="string"></element>
</sequence>
<!-- 书的属性 -->
<attribute name="出版社" type="string" use="required" ></attribute>
</complexType>
</element>
</sequence>
</complexType>
</element>
</schema>
在编写schema约束文档时的注意事项:
targetNamespace元素:指定schema文档中声明的元素属于哪个名称空间的。
elementFormDefault元素:指定局部元素是否受到该schema指定targetNamespace指定的名称空间的限制。
attributeFormDefault元素:指定局部属性是否收到该schema指定targetNamespace所指定的名称空间限定。
3. 使用对比注意事项