转自:http://www.jk1123.com/?p=124
以前写spring的配置文件的时候 一直搞不清楚在xml引入的xsd文件到底是怎么回事,只会从官方文档拷贝一份用,今天细细地研究了一下,原来也不难,就那么回事,记录下来
我们写下如下的示例的xml文件
<?xml version="1.0" encoding="UTF-8"?> 这里添加一些描述信息 c++从入门到放弃 329.0 小笨蛋 javaweb开发实战 212.09 小笨蛋 接下来我们要求对上面的xml文件中的元素和属性加上限制description元素可以有 也可以没有 而且必须出现在book元素前面
id必须有 且 值是int类型
name必须有 名字是字符串类型
price必须有 价格是double类型
author必须有 作者是字符串
一个books元素中可以有多个book元素
但是我们知道xml是可扩展的标记语言 根本是无限制的 那么我们就要引入books.xsd文件 对他进行限制
写下来如下规则:
<xs:schema xmlns=“http://xml.jk1123.com/books”
xmlns:xs=“http://www.w3.org/2001/XMLSchema”
targetNamespace=“http://xml.jk1123.com/books”
elementFormDefault=“qualified”
version=“0.0.1”>
<!–
xmlns=“http://xml.jk1123.com/books”
这里格式是 xmlns:前缀
但是我们这里为啥没写前缀呢 因为我们决定将此命名空间作为默认命名空间 所以省略不写了
这也是为啥在下方代码中: 我们可以直接写book元素
<xs:element ref=“book” minOccurs=“1” maxOccurs=“unbounded”></xs:element>
如果这里我们没有默认 比方说这里写成
xmlns:books=“http://xml.jk1123.com/books”
也即是说我们将使用该命名空间 前缀是books
那么那段代码应该写成
<xs:element ref=“books:book” minOccurs=“1” maxOccurs=“unbounded”></xs:element>
所以一般情况下,我们都会有一个默认命名空间
xmlns:xs="http://www.w3.org/2001/XMLSchema"
这里的格式是 xmlns:前缀
这里表示引入了 w3中xmlSchema官方命名空间 正式由于引入了这个命名空间 所以我们才可以使用下方那些
<xs:element> <xs:documentation> 等等一些标签 这个元素都被定义在官方的命名空间中
一个schema文件 必定会应用该官方命名空间
targetNamespace="http://xml.jk1123.com/books"
表示此约束文件的命名空间的名字 这个名字可以随便自定义,
但是一般情况下我们都会写成 http://公司域名/根元素的名字 比如这个例子中
http://xml.jk1123.com 表示的jk1123我的一个个人域名 books表示该约束文件中根元素
elementFormDefault="qualified"
表示该约束文件约束的xml 所有的元素都必须有命名空间前缀
version="0.0.1"
表示此约束文件的版本
-->
<xs:element name="books"><!--表示使用该命名空间的根元素是books-->
<xs:annotation>
<xs:documentation><!--该xsd的描述信息 -->
该xsd文件是对books命名空间的一些约束信息
</xs:documentation>
</xs:annotation>
<xs:complexType><!--表示该类型是一个复合类型也就是还说在books元素下可以包含子元素和属性-->
<xs:sequence><!--表示队列 也就是说books元素中可以有以下元素 而且必须是有序的出现 顺序不对也不行 -->
<xs:element name="description" maxOccurs="1" minOccurs="0"></xs:element>
<!--上面表示books元素可以包含子标签description 而且最多出现一次 必须出现在book子元素之前 -->
<xs:element ref="book" minOccurs="1" maxOccurs="unbounded"></xs:element>
<!--上面表示books元素可以包含子标签book 而且最少出现一次 必须出现在description子元素之后 最多无限制 -->
</xs:sequence>
</xs:complexType>
</xs:element>
<xs:element name="book">
<xs:complexType>
<xs:sequence>
<xs:element type="xs:string" name="name" minOccurs="1" ></xs:element>
<xs:element type="xs:double" name="price" minOccurs="1"></xs:element>
<xs:element type="xs:string" name="author" minOccurs="1"></xs:element>
</xs:sequence>
<xs:attribute name="id" use="required" type="xs:int"></xs:attribute>
</xs:complexType>
</xs:element>
</xs:schema>
如上的books.xsd文件就是对上面books.xml的限制
接下来我们的任务就是将xsd引入 books.xml代码修改如下
<?xml version="1.0" encoding="UTF-8"?><books xmlns=“http://xml.jk1123.com/books”
xmlns:xsi=“http://www.w3.org/2001/XMLSchema-instance”
xsi:schemaLocation="
http://xml.jk1123.com/books http://xml.jk1123.com/xsd/books.xsd
">
<!--
http://xml.jk1123.com/books http://xml.jk1123.com/xsd/books.xsd
xmlns="http://xml.jk1123.com/books"
表示引入books命名空间 并且作为默认命名空间
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
表示引入官方的命名空间XMLSchema-instance 并且前缀是xsi 约定俗成xsi当然你可以写 xyz
一个xml文件必然会引入该命名空间 因为看下面
xsi:schemaLocation="
http://xml.jk1123.com/books http://xml.jk1123.com/xsd/books.xsd
"
使用xsi前缀 使用官方命名空间中schemaLocation元素 该元素的作用是告知命名空间对应xsd位置
语法如下
xsi:schemaLocation="namespace名字 location地址"
http://xml.jk1123.com/books http://xml.jk1123.com/xsd/books.xsd
表示该命名空间对应的xsd文件 在http://xml.jk1123.com/xsd/books.xsd网络地址上 xml校验器会去该位置下载xsd文件
当然如果你的xsd文件在本地 你可以写相对地址 或者绝对地址 例如
http://xml.jk1123.com/books books.xsd
表示该xsd跟xml文件在同一个目录下
http://xml.jk1123.com/books file://E:\interllijworkspace\beike\xml\src\resource\books.xsd
表示该xsd文件在本地磁盘的哪个目录
-->
<description>
这里添加一些描述信息
</description>
<book id="1">
<name>c++从入门到放弃</name>
<price>329.0</price>
<author>小笨蛋</author>
</book>
<book id="2">
<name>javaweb开发实战</name>
<price>212.09</price>
<author>小笨蛋</author>
</book>
接下来我们再尝试写一些不合法的值 ![在这里插入图片描述](http://img.jk1123.com/blog/2018/04/18/05.png)