以前写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>