Schema
XML Schema是基于XML的DTD替代者,用于描述XML文档的结构。XMLSchema支持命名空间,基本数据类型和复杂数据类型,比DTD更具优势。
1、 命名空间
一个XML文件可以包含多个XMLSchema文件,不同的schema文件难免会出现重名的元素。为了解决该问题,Schema提供了命名空间,只要在使用元素时加上命名空间,就可以避免不同schema元素重名的问题,如下
<!—sop.xsd -->
<?xml version=@H_403_19@"1.0" encoding=@H_403_19@"UTF-8"?>
<schema xmlns=@H_403_19@"http://www.w3.org/2001/XMLSchema"
targetNamespace=@H_403_19@"http://www.ssl.org/aop"
xmlns:tns=@H_403_19@"http://www.ssl.org/aop"
elementFormDefault=@H_403_19@"qualified">
<element name=@H_403_19@"bean">
<complexType>
<sequence>
<element name=@H_403_19@"class"type=@H_403_19@"string"/>
</sequence>
</complexType>
</element>
</schema>
<!—spring.xsd -->
<?xml version=@H_403_19@"1.0" encoding=@H_403_19@"UTF-8"?>
<schema xmlns=@H_403_19@"http://www.w3.org/2001/XMLSchema"
targetNamespace=@H_403_19@"http://www.ssl.com/spring"
xmlns:tns=@H_403_19@"http://www.ssl.com/spring"
elementFormDefault=@H_403_19@"qualified">
<element name=@H_403_19@"bean">
<complexType>
<sequence>
<element name=@H_403_19@"class"type=@H_403_19@"string"/>
</sequence>
</complexType>
</element>
</schema>
上面的aop.xsd、spring.xsd都定义了bean元素,若在同一个XML文件中使用上面两个schema定义的bean元素,此时需要在引入schema时添加命名空间,如下
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns:spring="http://www.ssl.com/spring"
xmlns:aop="http://www.ssl.com/aop"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.ssl.com/spring spring.xsd
http://www.ssl.com/aop aop.xsd">
<spring:bean>com.ssl.User</spring:bean>
<aop:bean>com.ssl.Admin</aop:bean>
</beans>
可以在根元素的属性字段中,通过xmlns来引入schema文件,在引入schema文件时,可以通过xmlns:prefixName来指定命名空间的前缀,在使用该命名空间内的元素时,需要在元素前添加前缀。
在引入多个schema文件时,只有一个命名空间可以不添加前缀,该命名空间为默认命名空间。
2、 Schema文件
新建Schema文件时,在根元素schema中总有如下属性:
<schema xmlns=@H_403_19@"http://www.w3.org/2001/XMLSchema"
targetNamespace=@H_403_19@"http://www.ssl.com/person"
xmlns:tns=@H_403_19@"http://www.ssl.com/person"
elementFormDefault=@H_403_19@"qualified">
</schema>
(1)其中@H_403_19@http://www.w3.org/2001/XMLSchema为标准命名空间,该命名空间内定义了定义schema文件所用的元素和数据类型;
(2)targetNamespace表明schema被xml引入的命名空间;
(3)elementForDefault指出任何实例文档所使用本schema中声明的元素必须被命名空间限定;
3、 元素类型
在schema中可以使用的基本数据类型有int、interger、decimal、boolean、string、date、time。
在schema中,可以直接使用基本数据类型来声明简单元素类型,如下
<element name=@H_403_19@"id" type=@H_403_19@"int"/>
<element name=@H_403_19@"name"type=@H_403_19@"string"/>
<element name=@H_403_19@"age" type=@H_403_19@"int"/>
也可以由简单元素组成复杂元素,任何复杂的元素类型都是由简单的元素类型组合而成的,如下
<complexType name=@H_403_19@"user">
<sequence>
<element name=@H_403_19@"id" type=@H_403_19@"int"/>
<element name=@H_403_19@"name"type=@H_403_19@"string"/>
<element name=@H_403_19@"age" type=@H_403_19@"int"/>
</sequence>
</complexType>
复杂元素是由简单元素或其他复杂元素合成的,那么组合的规则是什么呢?在声明复杂元素时可以使用all、choice、sequence来嵌套子元素,以表明组合规则,具体如下
lall
规定子元素可以按照任意顺序出现,但每个子元素只能出现一次;
lchioce
规定可出现某个子元素或者另一个子元素,非此即彼,如下
<xs:element name=@H_403_19@"person">
<xs:complexType>
<xs:choice>
<xs:element name=@H_403_19@"employee"type=@H_403_19@"employee"/>
<xs:element name=@H_403_19@"member"type=@H_403_19@"member"/>
</xs:choice>
</xs:complexType>
</xs:element>
lsequence
规定子元素必须按照特定的顺序出现,如下
<element name=@H_403_19@"user">
<complexType>
<sequence>
<element name=@H_403_19@"id" type=@H_403_19@"int"/>
<element name=@H_403_19@"name"type=@H_403_19@"string"/>
<element name=@H_403_19@"age" type=@H_403_19@"int"/>
</sequence>
</complexType>
</element>
复杂元素是由简单元素或其他复杂元素合成的,那么组合的规则是什么呢?在声明复杂元素时可以使用all、choice、sequence来嵌套子元素,以表明组合规则,具体如下
此外,有些元素只允许出现一次,而有些元素可以出现多次;可以在choice、sequence、element等子元素上添加minOccurs和maxOccurs来指明允许元素出现的次数,如下
<?xml version=@H_403_19@"1.0" encoding=@H_403_19@"UTF-8"?>
<schema xmlns=@H_403_19@"http://www.w3.org/2001/XMLSchema"
targetNamespace=@H_403_19@"http://www.ssl.com/books"
xmlns:tns=@H_403_19@"http://www.ssl.com/books"
elementFormDefault=@H_403_19@"qualified">
<element name=@H_403_19@"books">
<complexType>
<sequence minOccurs=@H_403_19@"1" maxOccurs=@H_403_19@"unbounded">
<element name=@H_403_19@"book">
<complexType>
<sequence>
<element name=@H_403_19@"id" type=@H_403_19@"int"/>
<element name=@H_403_19@"name" type=@H_403_19@"string"/>
<element name=@H_403_19@"author"type=@H_403_19@"string"/>
</sequence>
</complexType>
</element>
</sequence>
</complexType>
</element>
</schema>
4、 元素约束
在实际应用中,往往需要添加元素约束,如性别只能为男女,年龄范围,手机号、Emailed格式等。在schema中在定义元素时,可以添加元素约束,如可以添加范围、枚举、字符串长度、正则表达式等约束。在schema中只能为简单元素添加这些约束限制,如下
<?xml version=@H_403_19@"1.0" encoding=@H_403_19@"UTF-8"?>
<schema xmlns=@H_403_19@"http://www.w3.org/2001/XMLSchema"
targetNamespace=@H_403_19@"http://www.ssl.com/user"
xmlns:tns=@H_403_19@"http://www.ssl.com/user"
elementFormDefault=@H_403_19@"qualified">
<element name=@H_403_19@"user">
<complexType>
<sequence>
<element name=@H_403_19@"id" type=@H_403_19@"unsignedInt"/>
<element name=@H_403_19@"name" type=@H_403_19@"tns:name"/>
<element name=@H_403_19@"age" type=@H_403_19@"tns:age"/>
<element name=@H_403_19@"gender" type=@H_403_19@"tns:gender"/>
</sequence>
</complexType>
</element>
<simpleType name=@H_403_19@"age">
<restriction base=@H_403_19@"int">
<minInclusive value=@H_403_19@"16"/>
<maxExclusive value=@H_403_19@"150"/>
</restriction>
</simpleType>
<simpleType name=@H_403_19@"name">
<restriction base=@H_403_19@"string">
<minLength value=@H_403_19@"6"/>
<maxLength value=@H_403_19@"18"/>
</restriction>
</simpleType>
<simpleType name=@H_403_19@"gender">
<restriction base=@H_403_19@"string">
<enumeration value=@H_403_19@"男"/>
<enumeration value=@H_403_19@"女"/>
</restriction>
</simpleType>
</schema>
5、 元素重用
在schema中定义元素,一般有3中方式,如下
l嵌套型
嵌套型,只有一个根元素,所有子元素都嵌套在根元素内,层次清楚;但同一个schema中可能会有大量重复元素,而不能很好的重用,如下
<schema xmlns=@H_403_19@"http://www.w3.org/2001/XMLSchema"
targetNamespace=@H_403_19@"http://www.ssl.com/books"
xmlns:tns=@H_403_19@"http://www.ssl.com/books"
elementFormDefault=@H_403_19@"qualified">
<element name=@H_403_19@"books">
<complexType>
<sequence minOccurs=@H_403_19@"1"maxOccurs=@H_403_19@"unbounded">
<element name=@H_403_19@"book">
<complexType>
<sequence>
<element name=@H_403_19@"id" type=@H_403_19@"int"/>
<element name=@H_403_19@"name" type=@H_403_19@"string"/>
<element name=@H_403_19@"author"type=@H_403_19@"string"/>
</sequence>
</complexType>
</element>
</sequence>
</complexType>
</element>
</schema>
l嵌套型+直线型
为了尽量使schema文件层次清楚和重复使用元素,应先定义可能会被重用的数据类型,如下
<schema xmlns=@H_403_19@"http://www.w3.org/2001/XMLSchema"
targetNamespace=@H_403_19@"http://www.ssl.com/books"
xmlns:tns=@H_403_19@"http://www.ssl.com/books"
elementFormDefault=@H_403_19@"qualified">
<element name=@H_403_19@"books">
<complexType>
<sequence minOccurs=@H_403_19@"1"maxOccurs=@H_403_19@"unbounded">
<element name=@H_403_19@"book"type=@H_403_19@"tns:book"/>
</sequence>
</complexType>
</element>
<complexType name=@H_403_19@"id">
<sequence>
<element name=@H_403_19@"id"type=@H_403_19@"unsignedInt"/>
</sequence>
</complexType>
<complexType name=@H_403_19@"name">
<sequence>
<element name=@H_403_19@"name"type=@H_403_19@"string"/>
</sequence>
</complexType>
<complexType name=@H_403_19@"author">
<sequence>
<element name=@H_403_19@"firstName"type=@H_403_19@"string"/>
<element name=@H_403_19@"lastName"type=@H_403_19@"string"/>
</sequence>
</complexType>
<complexType name=@H_403_19@"book">
<sequence>
<element name=@H_403_19@"id"type=@H_403_19@"tns:id"/>
<element name=@H_403_19@"name"type=@H_403_19@"tns:name"/>
<element name=@H_403_19@"author"type=@H_403_19@"tns:author"/>
</sequence>
</complexType>
</schema>
原文链接:https://www.f2er.com/xml/296314.html