在xml中,经常会遇到xmlns,schemaLocation这样的名词,到底是什么意思呢?我通过查询各种资料,有了一个初步的了解。
XML Schema 是用来描述 XML 文档的结构。
先定义一个schame的文档结构
<?xml version="1.0" encoding="UTF-8" ?>
<schema xmlns="http://www.w3.org/2001/XMLSchema"
targetNamespace="http://www.atguigu.com/bookSchema"
elementFormDefault="qualified">
<element name="书架"> <!-- 元素 -->
<complexType> <!-- 复杂类型 -->
<sequence maxOccurs="unbounded"> <!-- 序列 没有最大数 -->
<element name="书">
<complexType>
<sequence>
<element name="书名" type="string" />
<element name="作者" type="string" />
<element name="售价" type="string" />
</sequence>
</complexType>
</element>
</sequence>
</complexType>
</element>
</schema>
下面是符合上面schema的xml文件
<?xml version="1.0" encoding="UTF-8"?>
<书架 xmlns="http://www.atguigu.com/bookSchema"
xmlns:dd="http://www.w3.org/2001/XMLSchema-instance"
dd:schemaLocation="http://www.atguigu.com/bookSchema book.xsd">
<书>
<书名>JavaScript开发</书名>
<作者>老佟</作者>
<售价>28.00元</售价>
</书>
</书架>
此处的schema文件和xml文件在同一个文件夹,schame的名称为 book.xsd。
xml文件需要上面的schema文件进行定义。xml就需要引用上面的schema。如何引用呢,首先schema得有一个标识,然后在xml中引入这个标识即可。
在schema文件中有这样的一句话:targetNamespace="http://www.atguigu.com/bookSchema",这里的targetNamespace就相当于一个标识,也可以理解为id。标识这个schema的唯一性,在xml的xmlns中引入这个值即可
再看xml中的引用:有这样的一句话 xmlns="http://www.atguigu.com/bookSchema"。这句话就表示要引用一个 targetNamespace为http://www.atguigu.com/bookSchema的schema到当前的xml中。但光有schema的唯一标识还不够,还需要知道这个schema文件的位置。所以在xml中就会有这样的一句代码
schemaLocation="http://www.atguigu.com/bookSchema book.xsd" 这个代码的标准格式为
schemaLocation = “namespace path” (namepace即schema的id,path即schema的路径,中间用空格隔开) 如果多个的情况下为 schemaLocation = “namespace path namespace path namespace path”
这句代码锁代表的含义是 targetNamespace为http://www.atguigu.com/bookSchema的schema的文件位置是book.xsd(因为schema和xml文件在同一个路径下,spring配置文件中用的都是网络地址,直接定义到schema文件)
上面的代码中的schemaLocation的前面还有一个前缀,dd:schemaLocation。这个是什么意思呢?
这里需要解释一下,schemaLocation 也是一个元素,也需要一个schema来进行定义。所以在xml中还有一个schema的引用
xmlns ="http://www.w3.org/2001/XMLSchema-instance" 这个schema是用来定义schemaLocation的。
那么这时候,xml中就会有两个命名空间(即schema的标识)
xmlns="http://www.atguigu.com/bookSchema"
xmlns="http://www.w3.org/2001/XMLSchema-instance"
如果这样,那么问题就来了,下面的元素不知道自己是哪个namespace下的。所以这时候就需要一个别名
xmlns:dd="http://www.w3.org/2001/XMLSchema-instance" 把http://www.w3.org/2001/XMLSchema-instance的schema设置成了别名dd。 dd:schemaLocation 就表示是这个命名空间下的元素。
可能有人会问,http://www.w3.org/2001/XMLSchema-instance这个命名空间不用确定位置的路径么。个人理解,schema是w3c自己研发的,http://www.w3.org/2001/XMLSchema-instance 这个命名空间也是w3c的地址,所以内部可能不用引入(个人理解,错误勿喷。总之schemaLocation的schema不用path对应就是了)
如果把第一个schema也加入别名那么凡是相关的元素都需要加别名,如下:
<?xml version="1.0" encoding="UTF-8"?>
<aa:书架 xmlns:aa="http://www.atguigu.com/bookSchema"
xmlns:dd="http://www.w3.org/2001/XMLSchema-instance"
dd:schemaLocation="http://www.atguigu.com/bookSchema book.xsd">
<aa:书>
<aa:书名>JavaScript开发</aa:书名>
<aa:作者>老佟</aa:作者>
<aa:售价>28.00元</aa:售价>
</aa:书>
</aa:书架>
所以 如果引入了N个schema, 至少需要给n-1个取别名。
最后就是schema文件中的schema引用了
schema xmlns="http://www.w3.org/2001/XMLSchema"
schema同样也是xml文件,引入了http://www.w3.org/2001/XMLSchema的定义,同样是引用的w3c的schema,所以未加path(个人理解)