您当前的位置: 首页 > 慢生活 > 程序人生 网站首页程序人生
07_xml_约束_schema
发布时间:2022-07-25 00:01:13编辑:雪饮阅读()
在schema约束文档前先补充说明下,上篇中dtd文档中像是这样:
<!DOCTYPE users SYSTEM "users.dtd">
这里第一个users就是xml元素中的根元素名。
有了dtd约束,为什么还需要schema约束?
这是因为dtd约束太过粗犷,没有约束到具体的某个节点的值的类型,比如年龄是int类型, 如果输入为字符串类型怎么办?
那么今天的内容就有点多了。
约束文档schema编写如:
user.xsd:
<?xml version="1.0"?>
<xsd:schema xmlns="http://www.kasumi.cn/xml"
xmlns:xsd="http://www.w3.org/2001/XMLSchema"
targetNamespace="http://www.kasumi.cn/xml" elementFormDefault="qualified">
<!--这里首先定义了最外层根元素users的约束使用的是usersType-->
<xsd:element name="users" type="usersType"/>
<!--然后usersType约束的定义是这样的-->
<xsd:complexType name="usersType">
<!--users节点里面是顺序的节点(元素)列表-->
<xsd:sequence>
<!--每个元素的名字都是user元素,且每个user元素的约束定为userType,且这个user元素,最少有0个(minOccurs="0"),最多不限制(maxOccurs="unbounded")-->
<xsd:element name="user" type="userType" minOccurs="0" maxOccurs="unbounded"/>
</xsd:sequence>
</xsd:complexType>
<!--那么userType约束设定为这样-->
<xsd:complexType name="userType">
<!--这里每个user元素里面的元素规定为有序的name元素、age元素、gender元素(个人理解为先name元素放置,再放置age元素,最后放置gender元素)(已验证也确实是这样)-->
<xsd:sequence>
<!--然后user里面的name元素值限制为string类型-->
<xsd:element name="name" type="xsd:string"/>
<!--然后user里面的age元素值限制为自定义的ageType类型-->
<xsd:element name="age" type="ageType" />
<!--然后user里面的gender元素值限制为自定义的genderType类型-->
<xsd:element name="gender" type="genderType" />
</xsd:sequence>
<!--这里还为user元素约束了有一个number属性,且是必须有的(use="required"),然后该number属性的值的约束为自定义类型numberType-->
<xsd:attribute name="number" type="numberType" use="required"/>
</xsd:complexType>
<!--自定义的genderType定义-->
<xsd:simpleType name="genderType">
<!--约束gender的值为字符串类型的枚举类型,且枚举列表为male、female-->
<xsd:restriction base="xsd:string">
<xsd:enumeration value="male"/>
<xsd:enumeration value="female"/>
</xsd:restriction>
</xsd:simpleType>
<!--自定义的ageType定义-->
<xsd:simpleType name="ageType">
<!--约束age的值为int型的且值范围最小为0,最大为256-->
<xsd:restriction base="xsd:integer">
<xsd:minInclusive value="0"/>
<xsd:maxInclusive value="256"/>
</xsd:restriction>
</xsd:simpleType>
<!--自定义的numberType定义-->
<xsd:simpleType name="numberType">
<!--约束number的值必须为以"kasumi_"开头的且后面跟上4个数字的值-->
<xsd:restriction base="xsd:string">
<xsd:pattern value="kasumi_\d{4}"/>
</xsd:restriction>
</xsd:simpleType>
</xsd:schema>
一个基本的schema引入示例
test.xml:
<?xml version="1.0" encoding="utf-8" ?>
<!--
引入schema约束文档:
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" :
这个是引入xsi前缀,则个人理解schema约束文档中“xmlns:xsd”的值应该也是“http://www.w3.org/2001/XMLSchema-instance”才行
个人理解应该就是约束文档所遵循的schema版本要和你引入时候的版本一致的意思吧
xmlns="http://www.kasumi.cn/xml":
这里老师讲的有点不清楚,大致意思是说如果没有这句话,则接下来的xml文档中"users"必须写成"http://www.kasumi.cn/xml:users"结束标签也一样
并且users里面的user标签好像也要这样做,其它的更下级的暂时还不清楚
我起初认为是test3.xml这样,但是这样直接intelij idea都有报错了,后来我觉得应该是带有前缀的test2.xml这样
后来仔细再看内容发现我理解错了,test3.xml就是表达本来的意思,那么由于这么长的表达里面其实是有冒号“:”会导致intelij idea解析错误的原因是在这里了,当然我感觉网址这种反斜杠应该也会导致intelij idea解析报错
但这里暂不深究。
那么test2.xml就是说用“xmlns:a”中的a来代替了"http://www.kasumi.cn/xml"所以就没有问题了
这种“xmlns:a”起别名的方式可以起多个,据说同一个xml文档可以使用多个schema的约束文件,到时候schemaLocation也就是多个了,然后需要为每个schemaLocation都设置xmlns别名
好像是xsi:schemaLocation的值是一个列表了,然后,xmlns别名在根元素上有多个,每个别名的别名名称后面的值对应xsi:schemaLocation值里面每个列表项的值
具体结构应该是这样:
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:mvc="http://www.springframework.org/schema/mvc"
xsi:schemaLocation="
http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context.xsd
http://www.springframework.org/schema/mvc
http://www.springframework.org/schema/mvc/spring-mvc.xsd">
可以看到这里有多个xmlns别名以及xsi:schemaLocation是一个值列表,这配置文件参加
xsi:schemaLocation:这个就是schema约束文档的具体路径了,
xsi:schemaLocation:这个我理解就是schema约束文档中的targetNamespace(命名空间)的值再加上空格来拼接约束文件名(也可能是一个路径,假如有子目录里面放着呢?)
schema约束文档中有:xmlns和targetNamespace要重复写两次,目前来看值都是相同的,我认为这个和这里引入schema时候的xmlns以及xsi:schemaLocation中的前半部分有关联,差不多是同一个意思咯
-->
<users xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns="http://www.kasumi.cn/xml"
xsi:schemaLocation="http://www.kasumi.cn/xml user.xsd">
<user number="kasumi_0001">
<name>kasumi</name>
<age>18</age>
<gender>female</gender>
</user>
<user number="kasumi_0002">
<name>高久攀</name>
<age>18</age>
<gender>male</gender>
</user>
</users>
带有xmlns别名前缀的引入使用schema约束文档的示例:
test2.xml:
<?xml version="1.0" encoding="utf-8" ?>
<!--
下面这种是带前缀的使用schema的引入并使用的方法,test.xml那种是没有定义xmlns使用前缀,则使用的是默认的前缀
-->
<a:users xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:a="http://www.kasumi.cn/xml"
xsi:schemaLocation="http://www.kasumi.cn/xml user.xsd">
<a:user number="kasumi_0001">
<a:name>kasumi</a:name>
<a:age>18</a:age>
<a:gender>female</a:gender>
</a:user>
<a:user number="kasumi_0002">
<a:name>高久攀</a:name>
<a:age>18</a:age>
<a:gender>male</a:gender>
</a:user>
</a:users>
引入schema时候根元素写入xmlns非别名前假如带前缀的引入并使用schema约束文档的实例:
test3.xml(正是由于这个中如果没有反斜杠或者冒号这种特殊字符应该是可以直接使用的,这里没有测试,反正test2.xml是对这种思路的正确应用):
<?xml version="1.0" encoding="utf-8" ?>
<http://www.kasumi.cn/xml:users xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.kasumi.cn/xml user.xsd">
<http://www.kasumi.cn/xml:user number="kasumi_0001">
<http://www.kasumi.cn/xml:name>kasumi</http://www.kasumi.cn/xml:name>
<http://www.kasumi.cn/xml:age>18</http://www.kasumi.cn/xml:age>
<http://www.kasumi.cn/xml:gender>female</http://www.kasumi.cn/xml:gender>
</http://www.kasumi.cn/xml:user>
<http://www.kasumi.cn/xml:user number="kasumi_0002">
<http://www.kasumi.cn/xml:name>高久攀</http://www.kasumi.cn/xml:name>
<http://www.kasumi.cn/xml:age>18</http://www.kasumi.cn/xml:age>
<http://www.kasumi.cn/xml:gender>male</http://www.kasumi.cn/xml:gender>
</http://www.kasumi.cn/xml:user>
</http://www.kasumi.cn/xml:users>
据说是取自一份spring mvc的一个xml文件中可以看到xmlns可以多个别名一起使用的实例:
application_mvc.xml:
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:mvc="http://www.springframework.org/schema/mvc"
xsi:schemaLocation="
http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context.xsd
http://www.springframework.org/schema/mvc
http://www.springframework.org/schema/mvc/spring-mvc.xsd">
<context:annotation-config />
<context:component-scan base-package="cn.cisol.mvcdemo">
<context:include-filter type="annotation"
expression="org.springframework.stereotype.Controller" />
</context:component-scan>
<mvc:annotation-driven />
<mvc:resources mapping="/resources/**" location="/resources/" />
<bean
class="org.springframework.web.servlet.view.ContentNegotiatingViewResolver">
<property name="order" value="1" />
<property name="mediaTypes">
<map>
<entry key="json" value="application/json" />
<entry key="xml" value="application/xml" />
<entry key="htm" value="text/html" />
</map>
</property>
<property name="defaultViews">
<list>
<bean
class="org.springframework.web.servlet.view.json.MappingJackson2JsonView">
</bean>
</list>
</property>
<property name="ignoreAcceptHeader" value="true" />
</bean>
<bean
class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<property name="viewClass"
value="org.springframework.web.servlet.view.JstlView" />
<property name="prefix" value="/WEB-INF/jsps/" />
<property name="suffix" value=".jsp" />
</bean>
<bean id="multipartResolver"
class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
<property name="maxUploadSize" value="209715200" />
<property name="defaultEncoding" value="UTF-8" />
<property name="resolveLazily" value="true" />
</bean>
</beans>
关键字词:xml,约束,schema
上一篇:06_xml_约束_dtd