XML讲义-20131009

前端之家收集整理的这篇文章主要介绍了XML讲义-20131009前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。

第四章 XML Schema基本语法

4.1 XML Schema 入门

4.1.1 XML Schema 根元素

<?xml version="1.0" encoding="gb2312"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns="http://www.aaa.org/aaa" targetNamespace=http://www.aaa.org/aaa>
...
</xs:schema>
  • XML Schema本身是一个XML文档,因此他完全遵守XML的基本规则,其根元素是<schema.../>元素指定xmlns:xs="http://www.w3.org/2001/XMLSchema"是因为XML Schema本身是一个XML文档,也需要予以约束
  • targetNamespace=http://www.aaa.org/aaa指定该Schema的目标命名空间为http://www.aaa.org/aaa。也就是说,当需要引用该XML Schema里定义的Schema组件(包括元素、属性和类型等)时,通常需要使用该命名空间对应的前缀作为限定
  • xmlns=http://www.aaa.org/aaa指定使用http://www.aaa.org/aaa命名空间下的Schema组件(包括元素、属性和类型等)时,不需要使用任何前缀作为限定

4.1.2 XML 中引入无命名空间的Schema

noNamespaceBook.xsd

<?xml version="1.0" encoding="gb2312"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
<xs:complexType name="书籍列表_type">
<xs:sequence>
<xs:element ref="计算机书籍" maxOccurs="unbounded"/>
</xs:sequence>
</xs:complexType>
<xs:element name="计算机书籍" type="xs:string"/>
<xs:element name="书籍列表" type="书籍列表_type"/>
</xs:schema>


bookNoNamespace.xml

<?xml version="1.0" encoding="GB2312"?>
<书籍列表 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xsi:noNamespaceSchemaLocation="noNamespaceBook.xsd"> 
	<计算机书籍>Java</计算机书籍>
</书籍列表>
  • xmlns:xsi该属性值总是http://www.w3.org/2001/XMLSchema-instance
  • xsi:noNameSpaceSchemaLocation该属性值用于指定XML Schema文件的URI,可以是绝对的URL地址也可以是位于磁盘上的相对地址
  • 实际上noNameSpaceSchemaLocation属性就是http://www.w3.org/2001/XMLSchema-instance命名空间对应的XML Schema所定义的属性

4.1.3 XML 中引入有命名空间的Schema

  • 最多只有一个xmlns属性,其余的必须是形如xmlns[:xxx]的属性
  • 可以为xsi:schemaLocation属性指定多个值,要保持schemaNamespace schemaURI(命名空间 模式位置)的格式

book.xml

<?xml version="1.0" encoding="GB2312"?>
<书籍列表 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xsi:noNamespaceSchemaLocation="book.xsd"
	xmlns:crazy="http://www.crazyit.org/crazy"
	xsi:schemaLocation="http://www.crazyit.org/crazy crazy.xsd"> 
	<计算机书籍>Java</计算机书籍>
	<crazy:简要介绍>技术</crazy:简要介绍>
</书籍列表>
  • xsi:noNamespaceSchemaLocation="book.xsd"引入无命名空间的XML Schema
  • xmlns:crazy="http://www.crazyit.org/crazy"指定使用http://www.crazyit.org/crazy命名空间的XML Schema所定义的Schema组件时,必须使用crazy前缀作为限定
  • xsi:schemaLocation指定了有命名空间的XML Schema的命名空间及其URI

4.2 Schema 的数据类型

Schema支持的数据类型分为两大类:

  • 简单类型:既适合作为XML元素的类型,也适合作为XML属性的类型
  • 复杂类型:只能作为XML元素的类型

Schema支持的派生方式为:

  • 限制:使用<restriction.../>元素为原有类型增加一个或多个额外约束
  • 列表:使用<list.../>元素定义。通过这种方式产生的类型也称为列表类型
  • 联合:使用<union.../>元素定义,用于将多个已有的数据类型联合起来

4.3 使用限制派生新类型

通过使用<restriction.../>元素来添加一个或多个约束,从而派生出新类型

4.3.1 指定基类型的两种方式

  • id:指定该<restriction.../>元素的唯一标识
  • base:表明该<restriction.../>元素以哪种已有的类型作为基类型

Schema需要使用<simpleType.../>或<complexType.../>元素,其中<simpleType.../>用于定义新的简单类型,而<complexType.../>元素则用于定义新的复杂类型

如下Schema文档定义了一种新的数据类型age_Type,这种类型以int为基础,增加了最大值限制和最小值限制:

assignBase.xsd

<?xml version="1.0" encoding="UTF-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified" attributeFormDefault="unqualified">
	<!-- 新定义了一种数据类型:age_Type -->
	<xs:simpleType name="age_Type">
		<xs:restriction base="xs:int">
			<xs:maxInclusive value="100"/>
			<xs:minInclusive value="0"/>
			<!-- 最大值100、最小值0 -->
		</xs:restriction>
		<!-- 以int类型为基础 -->
	</xs:simpleType>
	<!-- 定义age元素,其类型是age_Type -->
	<xs:element name="age" type="age_Type"/>
</xs:schema>

assignBase.xml

<?xml version="1.0" encoding="UTF-8"?>
<age xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
	xsi:noNamespaceSchemaLocation="assignBase.xsd">
	34
</age>


使用<restriction.../>元素时也可以不指定base属性,而在其内添加<simpleType.../>子元素,其中<simpleType.../>子元素定义的数据类型将作为基类型

subType.xsd

<?xml version="1.0" encoding="UTF-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified" attributeFormDefault="unqualified">
	<!-- 新定义了一种数据类型:price_Type -->
	<xs:simpleType name="price_Type">
		<xs:restriction>
			<xs:simpleType>
				<xs:restriction base="xs:decimal">
					<xs:fractionDigits value="2"/>
					<xs:totalDigits value="5"/>
					<!-- 最多5位数,小数点后最多2位数 -->
				</xs:restriction>
				<!-- 以decimal为基类型 -->
			</xs:simpleType>
			<xs:maxInclusive value="100"/>
			<xs:minInclusive value="0"/>
			<!-- 最大值100、最小值0 -->
		</xs:restriction>
		<!-- 没有指定base属性,将以其simpleType子元素定义的类型作为基类型 -->
	</xs:simpleType>
	<!-- 定义price元素,其类型是price_Type -->
	<xs:element name="price" type="price_Type"/>
</xs:schema>

subType.xml

<?xml version="1.0" encoding="UTF-8"?>
<price xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
	xsi:noNamespaceSchemaLocation="subType.xsd">
	24.52
</price>



4.3.2 指定类型的两种方式

  • 使用type属性定义元素或属性的数据类型
  • 使用<simpleType.../>或<complexType.../>子元素指定元素或属性的数据类型

4.3.2.1 使用type属性

type.xsd

<?xml version="1.0" encoding="UTF-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
	<!-- 下面定义了2个元素 -->
	<xs:element name="books" type="xs:string"/>
	<xs:element name="开始日期" type="xs:date"/>
	<!-- 下面定义了2个属性 -->
	<xs:attribute name="price" type="xs:double"/>
	<xs:attribute name="islast" type="xs:boolean"/>
</xs:schema>

一下两个xml都是有效的

books.xml

<?xml version="1.0" encoding="UTF-8"?>
<books xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
	xsi:noNamespaceSchemaLocation="type.xsd">
	<!-- 元素的内容必须是字符串 -->
	Java	
         Java EE
</books>


开始日期.xml
<?xml version="1.0" encoding="UTF-8"?>
<开始日期 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
	xsi:noNamespaceSchemaLocation="type.xsd">
	<!-- 元素的内容必须是字符串 -->
	2009-02-12
</开始日期>


通过XML Schema的根元素下定义的任何元素都可以作为XML文档的根元素使用

通过XML Schema无法确定目标XML文档的根元素,xmlspy是通过判断哪个元素包含了其他元素来选择包含其他元素作为文档的根,这个根是可以被修改的。


4.3.2.2 使用子元素

subElement.xsd

<?xml version="1.0" encoding="UTF-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
	<!-- 下面定义了1个元素 -->
	<xs:element name="books">
		<!-- 直接使用simpleType子元素指定books元素的数据类型 -->
		<xs:simpleType>
			<xs:restriction base="xs:token">
				<xs:enumeration value="Java"/>
				<xs:enumeration value="Java EE"/>
			</xs:restriction>
		</xs:simpleType>
	</xs:element>
</xs:schema>


subElement.xml

<?xml version="1.0" encoding="UTF-8"?>
<books xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	 xsi:noNamespaceSchemaLocation="subElement.xsd">
	Java
</books>


将上面的<book.../>元素的值指定为“Java EE”也是有效的

4.4 使用<list.../>派生列表类型

Schema定义列表类型使用<list.../>元素,它可以由单个数据类型扩展出列表类型,因此使用该元素时必须指定列表元素的类型,有以下两种方式

  • 为<list.../>元素的itemType属性指定列表元素的数据类型(全局命名类型)
  • 为<list.../>元素增加<simpleType.../>子元素来指定列表元素的数据类型(局部匿名类型)

list.xsd

<?xml version="1.0" encoding="UTF-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"
	elementFormDefault="qualified" attributeFormDefault="unqualified">
	<!-- 定义一个age_list_Type列表类型 -->
	<xs:simpleType name="age_list_Type">
		<xs:list>
			<!-- 通过simpleType子元素指定列表元素的类型 -->
			<xs:simpleType>
				<!-- 以int类型为基类型 -->
				<xs:restriction base="xs:int">
					<!-- 最大值100、最小值0 -->
					<xs:minExclusive value="0"/>
					<xs:maxExclusive value="100"/>
				</xs:restriction>
			</xs:simpleType>
		</xs:list>
	</xs:simpleType>
	<!-- 定义age_list_Type类型的元素 -->
	<xs:element name="age_list" type="age_list_Type"/>
</xs:schema>


list.xml

<?xml version="1.0" encoding="UTF-8"?>
<age_list xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	 xsi:noNamespaceSchemaLocation="list.xsd">
	57 12	23	9
	68
</age_list>


也可以使用itemType属性指定列表元素的数据类型

list1.xsd

<?xml version="1.0" encoding="UTF-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified" attributeFormDefault="unqualified">
	<!-- 通过simpleType元素定义全局命名类型 -->
	<xs:simpleType name="age_Type">
		<!-- 以int类型为基类型 -->
		<xs:restriction base="xs:int">
			<!-- 最大值100、最小值0 -->
			<xs:minExclusive value="0"/>
			<xs:maxExclusive value="100"/>
		</xs:restriction>
			<!-- 通过simpleType子元素指定列表元素的类型 -->
	</xs:simpleType>
	<!-- 定义一个age_list_Type列表类型 -->
	<xs:simpleType name="age_list_Type">
		<!-- 使用itemType属性指定列表元素类型 -->
		<xs:list itemType="age_Type"></xs:list>
	</xs:simpleType>
	<!-- 定义age_list_Type类型的元素 -->
	<xs:element name="age_list" type="age_list_Type"/>
</xs:schema>


需要指出的是,列表类型的值是以空白作为分隔符的,因此通常没有必要使用为string、normalizedString、token等元素建立列表类型,因为它们本身就可能包含空格

列表类型对空白的处理方式是先将所有空包(包括回车、换行和制表符)替换成空格,然后去除内容前后的空格,再将内容中间的多个连续空格压缩成单个空格,这个空格可以作为元素的分隔符

4.4.1 限制列表类型

  • 长度约束:length、maxLength、minLength
  • 枚举类型:enumeration
  • 正则表达式约束:pattern
  • 空白处理:whiteSpace

price_list.xsd

<?xml version="1.0" encoding="UTF-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified" attributeFormDefault="unqualified">
	<!-- 以decimal为基准类型,定义一个price_Type类型 -->
	<xs:simpleType name="price_Type">
		<xs:restriction base="xs:decimal">
			<xs:maxExclusive value="100"/>
			<xs:minExclusive value="0"/>
			<xs:fractionDigits value="2"/>
			<!-- 最大值100、最小值0 -->
			<!-- 必须包含2个小数 -->
		</xs:restriction>
	</xs:simpleType>
	<xs:simpleType name="price_list_Type">
		<xs:restriction>
			<xs:simpleType>
				<xs:list itemType="price_Type"/>
			</xs:simpleType>
			<xs:length value="4"/>
			<!-- 使用simpleType定义匿名类型作为restriction元素的基类型 -->
			<!-- 指定列表类型必须包含4个列表值 -->
		</xs:restriction>
	</xs:simpleType>
	<xs:element name="price" type="price_list_Type"/>
</xs:schema>


price_list.xml

<?xml version="1.0" encoding="UTF-8"?>
<price xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xsi:noNamespaceSchemaLocation="price_list.xsd">
	<!-- 包含4个有效的price值 -->
	45.12 12.34
	23.45	12.23
</price>


enumeration和pattern两种约束非常容易混淆,其主要原因是对列表类型增加enumeration和pattern约束时,是对整个列表内容起作用,而不是对单个的列表项起作用

emails_list.xsd

<?xml version="1.0" encoding="UTF-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified" attributeFormDefault="unqualified">
	<!-- 定义一个简单的email_Type -->
	<xs:simpleType name="email_Type">
		<xs:restriction base="xs:string">
			<xs:pattern value="\w{2,10}@\w{3,10}\.(com|org|cn|net)"/>
			<!-- 指定必须匹配指定正则表达式 -->
		</xs:restriction>
	</xs:simpleType>
	<!-- 定义一个列表类型 -->
	<xs:simpleType name="emails_Type">
		<xs:list itemType="email_Type"/>
		<!-- 指定列表元素的类型是email_Type -->
	</xs:simpleType>
	<xs:element name="emails" type="emails_Type"/>
</xs:schema>


emails_list.xml

<?xml version="1.0" encoding="UTF-8"?>
<emails xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
	xsi:noNamespaceSchemaLocation="emails_list.xsd">
	abc@crazyit.org
	bar@crazyit.net.cn
</emails>


上面在定义Schema时并没有为<list.../>元素增加pattern约束,而是先为string类型增加pattern约束派生出email_Type类型,然后再将email_Type派生成对应的列表类型

emails_list2.xsd

<?xml version="1.0" encoding="UTF-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" 
	elementFormDefault="qualified" attributeFormDefault="unqualified">
	<!-- 定义一个简单的string_list列表 -->
	<xs:simpleType name="string_list">
		<xs:list itemType="xs:string"/>
	</xs:simpleType>
	<!-- 定义一个列表类型 -->
	<xs:simpleType name="emails_Type">
		<!-- 指定列表元素的类型是email_Type -->
		<xs:restriction base="string_list">
			<!-- 指定必须匹配指定正则表达式 -->
			<xs:pattern value="\w{2,10}\.(com|org|cn|net)"/>
		</xs:restriction>
	</xs:simpleType>
	<xs:element name="emails" type="emails_Type"/>
</xs:schema>


如上所示Schema才是对列表类型应用pattern约束。整个列表类型内容整体必须匹配指定的正则表达式

4.5 使用<union.../>派生联合类型

  • 为<union.../>元素的memberTypes属性指定一个到多个简单类型,多个简单类型之间以空格隔开
  • 为<union.../>元素增加一个到多个<simpleType.../>子元素,每个<simpleType.../>子元素指定一个简单类型

union.xsd

<?xml version="1.0" encoding="UTF-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified" attributeFormDefault="unqualified">
	<!-- 定义了一个price_Type类型 -->
	<xs:simpleType name="price_Type">
		<xs:restriction base="xs:decimal">
			<xs:maxExclusive value="100"/>
			<xs:minExclusive value="0"/>
			<!-- 最大值是100、最小值0 -->
		</xs:restriction>
		<!-- 以decimal为基础 -->
	</xs:simpleType>
	<!-- 定义了一个publish_date_Type类型 -->
	<xs:simpleType name="publish_date_Type">
		<xs:restriction base="xs:date">
			<xs:minExclusive value="2007-01-01"/>
			<xs:maxExclusive value="2009-12-31"/>
			<!-- 最大值是2009-12-31、最小值2007-01-01 -->
		</xs:restriction>
		<!-- 以date为基础 -->
	</xs:simpleType>
	<!-- 定义price_publish_Type类型 -->
	<xs:simpleType name="price_publish_Type">
		<xs:union memberTypes="price_Type publish_date_Type"/>
		<!-- 将price_Type、publish_date_Type两个类型联合成新类型 -->
	</xs:simpleType>
	<xs:element name="price_name" type="price_publish_Type"/>
</xs:schema>


union.xml

<?xml version="1.0" encoding="UTF-8"?>
<price_name xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xsi:noNamespaceSchemaLocation="union2.xsd">
	<!-- 让元素值是publish_date_Type是有效的  -->
	2009-12-12
	<!-- 让元素值是price_Type也是有效的  -->
	<!-- 10.23 -->
</price_name>


union2.xsd

<?xml version="1.0" encoding="UTF-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"
	elementFormDefault="qualified" attributeFormDefault="unqualified">
	<!-- 定义price_publish_Type类型 -->
	<xs:simpleType name="price_publish_Type">
		<!-- 将两个匿名类型联合成新类型 -->
		<xs:union>
			<!-- 定义第一个匿名的成员类型 -->
			<xs:simpleType>
				<!-- 以decimal为基础 -->
				<xs:restriction base="xs:decimal">
					<!-- 最大值是100、最小值0 -->
					<xs:maxExclusive value="100"/>
					<xs:minExclusive value="0"/>
				</xs:restriction>
			</xs:simpleType>
			<!-- 定义第二个匿名的成员类型 -->
			<xs:simpleType>
				<!-- 以date为基础 -->
				<xs:restriction base="xs:date">
					<!-- 最大值是2009-12-31、最小值2007-01-01 -->	
					<xs:minExclusive value="2007-01-01"/>
					<xs:maxExclusive value="2009-12-31"/>
				</xs:restriction>
			</xs:simpleType>		
		</xs:union>	
	</xs:simpleType>
	<xs:element name="price_name" type="price_publish_Type"/>
</xs:schema>


4.5.1 限制联合类型

  • 枚举类型:enumeration
  • 正则表达式约束:pattern

与限制列表类型类似,为联合类型添加的约束是对整个联合类型的值起作用

union_constraint.xsd

<?xml version="1.0" encoding="UTF-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"
	elementFormDefault="qualified" attributeFormDefault="unqualified">
	<!-- 定义了一个price_Type类型 -->
	<xs:simpleType name="price_Type">
		<xs:restriction base="xs:decimal">
			<xs:maxExclusive value="100"/>
			<xs:minExclusive value="0"/>
			<!-- 最大值是100、最小值0 -->
		</xs:restriction>
		<!-- 以decimal为基础 -->
	</xs:simpleType>
	<!-- 定义了一个publish_date_Type类型 -->
	<xs:simpleType name="publish_date_Type">
		<xs:restriction base="xs:date">
			<xs:minExclusive value="2007-01-01"/>
			<xs:maxExclusive value="2009-12-31"/>
			<!-- 最大值是2009-12-31、最小值2007-01-01 -->
		</xs:restriction>
		<!-- 以date为基础 -->
	</xs:simpleType>
	<!-- 定义price_publish_Type类型 -->
	<xs:simpleType name="price_publish_Type">
		<xs:union memberTypes="price_Type publish_date_Type"/>
		<!-- 将price_Type、publish_date_Type两个类型联合成新类型 -->
	</xs:simpleType>
	<xs:simpleType name="union_constraint_Type">
		<xs:restriction base="price_publish_Type">
			<!-- 此处列出的值要么是price_Type类型、要么是publish_date_Type类型 -->
			<xs:enumeration value="12.7"/>
			<xs:enumeration value="23.4"/>
			<xs:enumeration value="2008-12-12"/>			
		</xs:restriction>
	</xs:simpleType>
	<xs:element name="price_name" type="union_constraint_Type"/>
</xs:schema>


4.6 合并多个Schema

4.6.1 使用redefine

  • <redefine.../>元素必须作为Schema的根元素<schema.../>的子元素
  • <redefine.../>元素必须放在Schema的开头
  • 使用<redefine.../>元素必包含的Schema要么没有命名空间,要么其命名空间与当前Schema的目标命名空间相同。这意味着,使用<redefine.../>元素包含进来的Schema将不再保留它本身的命名空间,被包含Schema所定义的全部组件都将放入当前Schema的命名空间

included.xsd

<?xml version="1.0" encoding="UTF-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" 
	elementFormDefault="qualified" attributeFormDefault="unqualified">
	<!-- 定义一个ageType类型 -->
	<xs:simpleType name="age_Type">
		<xs:restriction base="xs:int">
			<xs:maxExclusive value="100"/>
			<xs:minExclusive value="0"/>
		</xs:restriction>
	</xs:simpleType>
</xs:schema>


上面的Schema定义了一个age_Type类型

include.xsd

<?xml version="1.0" encoding="UTF-8"?>
<!-- 该Schema指定了targetNamespace -->
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" 
	targetNamespace="http://www.crazyit.org"
	xmlns="http://www.crazyit.org"
	elementFormDefault="qualified" attributeFormDefault="unqualified">
	<!-- 包含名为included.xsd的Schema -->
	<xs:redefine schemaLocation="included.xsd"/>
	<!-- 直接使用另一份Schema中定义的age_Type -->
	<xs:element name="age" type="age_Type"/>
</xs:schema>

被包含的Schema没有自己的目标命名空间,因此其所定义的age_Type类型将被完全引入到当前命名空间内

  • <redefine.../>元素允许当前Schema重定义被包含Schema里的Schema组件,包括重定义类型、重定义元素组、重定义属性
  • 重定义的组件必须是被<redefine.../>元素包含进来的Schema里已有的组件
  • 重定义的组件只能基于被包含Schema里已有的组件增加限制(利用<restrictions.../>)或增加扩展(利用<extension.../>)
  • 如果是采用增加限制的方式来重定义原有的组件,则<restriction.../>元素里所包含的约束不能违反原类型里已有的约束

redefined.xsd

<?xml version="1.0" encoding="UTF-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" 
	elementFormDefault="qualified" attributeFormDefault="unqualified">
	<!-- 定义一个ageType类型 -->
	<xs:simpleType name="age_Type">
		<xs:restriction base="xs:int">
			<xs:maxExclusive value="100"/>
			<xs:minExclusive value="0"/>
		</xs:restriction>
	</xs:simpleType>
</xs:schema>


上面的Schema没有自己的目标命名空间,只是定义了一个简单的age_Type类型,下面的Schema将使用<restriction.../>元素来包含它,并重定义age_Type类型

redefine.xsd

<?xml version="1.0" encoding="UTF-8"?>
<!-- 该Schema指定了targetNamespace -->
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"
	xmlns="http://www.crazyit.org" 
	targetNamespace="http://www.crazyit.org" 
	elementFormDefault="qualified" attributeFormDefault="unqualified">
	<!-- 包含名为redefined.xsd的Schema -->
	<xs:redefine schemaLocation="redefined.xsd">
		<!-- 重定义的类型必须是被包含Schema中已有的类型 -->
		<xs:simpleType name="age_Type">
			<!-- 对被包含Schema中已有类型添加限制 -->
			<xs:restriction base="age_Type">
				<!-- 下面添加的约束不能违反原有的约束 -->
				<xs:maxExclusive value="80"/>
			</xs:restriction>
		</xs:simpleType>		
	</xs:redefine>
	<!-- 使用被重定义后的age_Type -->
	<xs:element name="age" type="age_Type"/>
</xs:schema>


4.6.2 使用import

  • <import.../>元素必须作为Schema的根元素<schema.../>的子元素
  • <import.../>元素必须放在Schema的开头
  • 使用<import.../>元素导入的Schema要么没有目标命名空间,要么其目标命名空间与当前Schema的目标命名空间不同,而且被导入的Schema和导入的Schema的目标命名空间绝对不能相同。这意味着,使用<import.../>元素导入的Schema一定要保留它原来的命名空间,使用被导入的Schema里的Schema组件时应该添加前缀作为限定(除非被导入的Schema没有命名空间)

imported.xsd

<?xml version="1.0" encoding="UTF-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" 
	targetNamespace="http://www.crazyit.org"
	xmlns="http://www.crazyit.org"
	elementFormDefault="qualified" attributeFormDefault="unqualified">
	<!-- 定义一个ageType类型 -->
	<xs:simpleType name="age_Type">
		<xs:restriction base="xs:int">
			<xs:maxExclusive value="100"/>
			<xs:minExclusive value="0"/>
		</xs:restriction>
	</xs:simpleType>
</xs:schema>


import.xsd

<?xml version="1.0" encoding="UTF-8"?>
<!-- 该Schema指定了targetNamespace -->
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" 
	targetNamespace="http://www.crazyit.org/schema"
	xmlns:crazyit="http://www.crazyit.org"
	xmlns="http://www.crazyit.org/schema"
	elementFormDefault="qualified" attributeFormDefault="unqualified">
	<!-- 导入名为imported.xsd的Schema,被导入Schema的
		命名空间是http://www.crazyit.org -->
	<xs:import schemaLocation="imported.xsd" namespace="http://www.crazyit.org"/>
	<!-- 使用另一份Schema中定义的age_Type时,必须添加命名空间前缀作为限定 -->
	<xs:element name="age" type="crazyit:age_Type"/>
</xs:schema>

猜你在找的XML相关文章