XML学习之Xml Schema:九、派生复杂类型

         在文档中引用派生类型

         可以使用xsi:type属性来显示的标识类型,告诉模式处理器你使用哪个派生类型。xsi:type属性是XML Schema实例空间http://www.w3.org/2001/XMLSchema-instance。下面是一个例子,商店里的商品有图书和音像品之分。图书有页数,音像品有格式。他们都是一个共同的基类。

<?xml version="1.0" encoding="UTF-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
	<xs:element name="NetStore" type="storeType"/>
	<xs:complexType name="storeType">
		<xs:sequence>
			<xs:element name="Items">
				<xs:complexType>
					<xs:sequence>
						<xs:element ref="Item" minOccurs="0" maxOccurs="unbounded"/>
					</xs:sequence>
				</xs:complexType>
			</xs:element>
		</xs:sequence>
	</xs:complexType>
	<xs:element name="Item" type="itemType"/>
	<xs:complexType name="itemType">
		<xs:sequence>
			<xs:element name="id" type="xs:string"/>
			<xs:element name="title" type="xs:string"/>
			<xs:element name="bookconcern" type="xs:string"/>
		</xs:sequence>
	</xs:complexType>
	<xs:complexType name="bookType">
		<xs:complexContent>
			<xs:extension base="itemType">
				<xs:sequence>
					<xs:element name="pageCount" type="xs:integer"/>
				</xs:sequence>
			</xs:extension>
		</xs:complexContent>
	</xs:complexType>
	<xs:complexType name="videoType">
		<xs:complexContent>
			<xs:extension base="itemType">
				<xs:sequence>
					<xs:element name="format">
						<xs:simpleType>
							<xs:restriction base="xs:token">
								<xs:enumeration value="VCD"/>
								<xs:enumeration value="DVD"/>
							</xs:restriction>
						</xs:simpleType>
					</xs:element>
				</xs:sequence>
			</xs:extension>
		</xs:complexContent>
	</xs:complexType>
</xs:schema>

xs_instance.xsd

<?xml version="1.0" encoding="UTF-8"?>
<NetStore xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="XS_Instance.xsd">
	<Items>
		<Item xsi:type="bookType">
			<id>123</id>
			<title>XML</title>
			<bookconcern>北京出版社</bookconcern>
			<pageCount>751</pageCount>
		</Item>
		<Item xsi:type="videoType">
			<id>456</id>
			<title>C#</title>
			<bookconcern>上海出版社</bookconcern>
			<format>DVD</format>
		</Item>
		<Item xsi:type="itemType">
			<id>789</id>
			<title>C++</title>
			<bookconcern>杭州出版社</bookconcern>
		</Item>
	</Items>
</NetStore>

 实例xml

           替换组

          XML Schema提供了一种机制,称为替换组(substitution group),允许在内容模型中声明的某个元素被其他元素所替换。替换组有头元素(head element)和替换成员组成,头元素和替换成员都必须是全局元素,有相同的类型,或都有头元素派生。替换成员需要使用一个特殊的属性sbustitutionGroup,用于指定要替换的头元素的名字。在内容模型中引用头元素,在实例文档中则用任意的替换组成员来替换头元素。

<?xml version="1.0" encoding="UTF-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
	<xs:element name="NetStore" type="storeType"/>
	<xs:complexType name="storeType">
		<xs:sequence>
			<xs:element name="Items">
				<xs:complexType>
					<xs:sequence>
						<xs:element ref="Item" minOccurs="0" maxOccurs="unbounded"/>
					</xs:sequence>
				</xs:complexType>
			</xs:element>
		</xs:sequence>
	</xs:complexType>
	<!--全局声明的item元素作为替换组的头元素-->
	<xs:element name="Item" type="itemType"/>
	<!--全局声明的book和viedo元素作为替换组的成员。
               使用substitutionGroup属性指定要替换的头元素-->
    	<xs:element name="book" type="bookType" substitutionGroup="Item"/>
	<xs:element name="video" type="videoType" substitutionGroup="Item"/>
	
	<xs:complexType name="itemType">
		<xs:sequence>
			<xs:element name="id" type="xs:string"/>
			<xs:element name="title" type="xs:string"/>
			<xs:element name="bookconcern" type="xs:string"/>
		</xs:sequence>
	</xs:complexType>
	<!--bookType从itemType派生-->
	<xs:complexType name="bookType">
		<xs:complexContent>
			<xs:extension base="itemType">
				<xs:sequence>
					<xs:element name="pageCount" type="xs:integer"/>
				</xs:sequence>
			</xs:extension>
		</xs:complexContent>
	</xs:complexType>
	<!--videoType从itemType派生-->
	<xs:complexType name="videoType">
		<xs:complexContent>
			<xs:extension base="itemType">
				<xs:sequence>
					<xs:element name="format">
						<xs:simpleType>
							<xs:restriction base="xs:token">
								<xs:enumeration value="VCD"/>
								<xs:enumeration value="DVD"/>
							</xs:restriction>
						</xs:simpleType>
					</xs:element>
				</xs:sequence>
			</xs:extension>
		</xs:complexContent>
	</xs:complexType>
</xs:schema>

xs_substitution.xsd

<?xml version="1.0" encoding="UTF-8"?>
<NetStore xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="XS_Substitution.xsd">
	<Items>
		<Item>
			<id>123</id>
			<title>C</title>
			<bookconcern>北京人民出版社</bookconcern>
		</Item>
		<book>
			<id>456</id>
			<title>C++</title>
			<bookconcern>上海人民出版社</bookconcern>
			<pageCount>123</pageCount>
		</book>
		<video>
			<id>789</id>
			<title>C#</title>
			<bookconcern>广州人民出版社</bookconcern>
			<format>DVD</format>
		</video>
	</Items>
</NetStore>

xml_substitution.xml

 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值