XML学习之Xml Schema:十、一致性约束

        在Xml Schema中有3种一致性约束,分别是unique约束、key约束、keyref约束。

        uniquek约束

        使用xs:unique元素约束,用于指定任意的元素或属性在某个范围内是唯一的。该元素有一个必须的属性name,用于指定unique约束的名称。

<?xml version="1.0" encoding="UTF-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
	<xs:element name="company" type="companyType">
		<xs:unique name="numberUnique">
			<xs:selector xpath="dept/employee"/>
			<xs:field xpath="number"/>
		</xs:unique>
	</xs:element>
	<xs:complexType name="companyType">
		<xs:sequence>
			<xs:element name="dept" type="deptType" maxOccurs="unbounded"/>
		</xs:sequence>
	</xs:complexType>
	<xs:complexType name="deptType">
		<xs:sequence>
			<xs:element name="employee" type="employeeType" maxOccurs="unbounded"/>
		</xs:sequence>
	</xs:complexType>
	<xs:complexType name="employeeType">
		<xs:sequence>
			<xs:element name="number" type="xs:string"/>
			<xs:element name="name" type="xs:string"/>
		</xs:sequence>
	</xs:complexType>
</xs:schema>

unique示例1(元素约束)

<?xml version="1.0" encoding="UTF-8"?>
<company xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="XS_Unique.xsd">
	<dept>
		<employee>
			<number>1-01</number>
			<name>AA</name>
		</employee>
		<employee>
			<number>1-02</number>
			<name>AB</name>
		</employee>
	</dept>
	<dept>
		<employee>
			<number>2-01</number>
			<name>BA</name>
		</employee>
		<employee>
			<number>2-02</number>
			<name>BB</name>
		</employee>
	</dept>
</company>

Xml示例1(元素约束)

<?xml version="1.0" encoding="UTF-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
	<xs:element name="company" type="companyType">
		<xs:unique name="numberUnique">
			<xs:selector xpath="*/employee"/>
			<xs:field xpath="number"/>
			<!--属性字段-->
			<xs:field xpath="@deptID"/>
		</xs:unique>
	</xs:element>
	<xs:complexType name="companyType">
		<xs:sequence>
			<xs:element name="dept" type="deptType" maxOccurs="unbounded"/>
		</xs:sequence>
	</xs:complexType>
	<xs:complexType name="deptType">
		<xs:sequence>
			<xs:element name="employee" type="employeeType" maxOccurs="unbounded"/>
		</xs:sequence>
	</xs:complexType>
	<xs:complexType name="employeeType">
		<xs:sequence>
			<xs:element name="number" type="xs:string"/>
			<xs:element name="name" type="xs:string"/>
		</xs:sequence>
		<xs:attribute name="deptID" type="xs:string" use="required"/>
	</xs:complexType>
</xs:schema>

unique示例2(元素、属性约束)

<?xml version="1.0" encoding="UTF-8"?>
<company xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="XS_Unique.xsd">
	<dept>
		<employee deptID="1">
			<number>1-1</number>
			<name>A</name>
		</employee>
		<employee deptID="2">
			<number>1-1</number>
			<name>A</name>
		</employee>
	</dept>
</company>

XML示例2(元素、属性约束)

<?xml version="1.0" encoding="UTF-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" targetNamespace="http://www.jwt.com/company" elementFormDefault="qualified" xmlns:com="http://www.jwt.com/company">
	<xs:element name="Company" type="com:CompanyType">
		<xs:unique name="NameUnique">
		<!--此处需要加上com前缀,否则无法定位-->
			<xs:selector xpath="com:Comployee"/>
			<xs:field xpath="com:Name"/>
		</xs:unique>
	</xs:element>
	<xs:complexType name="CompanyType">
		<xs:sequence>
			<xs:element name="Comployee" type="com:CompolyeeType" maxOccurs="unbounded"/>
		</xs:sequence>
	</xs:complexType>
	<xs:complexType name="CompolyeeType">
		<xs:sequence>
			<xs:element name="Name" type="xs:string"/>
			<xs:element name="Age" type="xs:integer"/>
		</xs:sequence>
	</xs:complexType>
</xs:schema>
模式文件(有命名空间)
<?xml version="1.0" encoding="UTF-8"?>
<Company xmlns="http://www.jwt.com/company" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.jwt.com/company
XS_UniqueNamespace.xsd">
	<Comployee>
		<Name>ZS</Name>
		<Age>29</Age>
	</Comployee>
	<Comployee>
		<Name>LS</Name>
		<Age>30</Age>
	</Comployee>
</Company>
XML文件(引用上面XSD文件)
       
        Key约束
        Key约束与unique约束类似,他们之间的区别是,key约束指定的元素或属性不能是可选的,他们在文档中必须是寻在的。对于那些可选的元素或属性,可以是用unique约束。该约束有一个必须的属性name,用于指定key约束的名称。
<?xml version="1.0" encoding="UTF-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
	<xs:element name="company" type="companyType">
		<xs:key name="nameKey">
			<xs:selector xpath="comployee"/>
			<xs:field xpath="name"/>
		</xs:key>
	</xs:element>
	<xs:complexType name="companyType">
		<xs:sequence>
			<xs:element name="comployee" type="comployeeType" maxOccurs="unbounded"/>
		</xs:sequence>
	</xs:complexType>
	<xs:complexType name="comployeeType">
		<xs:sequence>
			<xs:element name="name" type="xs:string"/>
			<xs:element name="age" type="xs:integer"/>
		</xs:sequence>
	</xs:complexType>
</xs:schema>

        keyref约束
        keyref约束必须和unique约束和key约束一起使用,用于在两个数据之间建立一种引用关系,这种关系类似于数据库表之间的主外键关系,unique和key类似于数据库的主键,keyref约束类似于数据库的外键约束。该元素带有两个必须的属性name和refer。name用于指定keyref约束的名称,refer属性指定在模式文档中定义的unique和key约束的名称。
<?xml version="1.0" encoding="UTF-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
	<xs:element name="company" type="companyType">
		<xs:key name="nameKey">
			<xs:selector xpath="comployee"/>
			<xs:field xpath="name"/>
		</xs:key>
		<xs:keyref refer="nameKey" name="managerKeyRef">
			<xs:selector xpath="comployee"/>
			<xs:field xpath="manager"/>
		</xs:keyref>
	</xs:element>
	<xs:complexType name="companyType">
		<xs:sequence>
			<xs:element name="comployee" type="comployeeType" maxOccurs="unbounded"/>
		</xs:sequence>
	</xs:complexType>
	<xs:complexType name="comployeeType">
		<xs:sequence>
			<xs:element name="name" type="xs:string"/>
			<xs:element name="age" type="xs:integer"/>
			<xs:element name="manager" type="xs:string" minOccurs="0"/>
		</xs:sequence>
	</xs:complexType>
</xs:schema>

<?xml version="1.0" encoding="UTF-8"?>
<company xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="XS_Keyref.xsd">
	<comployee>
		<name>ZS</name>
		<age>29</age>
	</comployee>
	<comployee>
		<name>LS</name>
		<age>28</age>
		<manager>ZS</manager>
	</comployee>
	<comployee>
		<name>WW</name>
		<age>27</age>
		<manager>ZS</manager>
	</comployee>
</company>

 
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值