xml的命名空间
最近又复习了一遍spring,发现了之前一直没明白的事情,xml文件的beans标签内的那一堆属性是什么意思。我先举一个例子吧,如果我这篇文章不是你看的第一篇,你肯定会看过类似这样的例子
<a:head xmlns:a="xiaobai"> 小白 </head> <b:head xmlns:b="xiaohei"> 小白 </head>
他们两个的区别就是两个不同的head属于两个不同的命名空间,其实这样说是对的,但是这个例子是毫无实际意义的。
首先每一个xml都可以分为两类,有效的xml和无效的xml。
- 有效的是指,具有良好的格式,和语义约束。
- 无效的,当然就是违反了上面两个其中的一个。
现在我先不提命名空间的事,先说一下,一个xml有效是需要什么,一个良好的格式,就是符合树的层次结构,嵌套合理等,语义约束就是,规定这个xml能定义什么标签,什么属性。这么说吧,html就像是一个加了语义限定后的xml。那么怎么加限定呢,有两种方式,一种是DTD,另一种是Schema,早期的spring的xml用的是DTD现在都是Schema,所以你现在看到的xml文件里开头那一堆就是Schema限定,DTD是不支持命名空间和属性语义限定的,所以被抛弃了。
好了,现在知道了什么是Schema,嗯,他就是xml的一个语义限定,那我直接给出答案,其实命名空间就是一个Schema。下面我把命名空间都给换成:语义,这个词。
在写Schema的时候是要为该Schema写命名空间值的,如果不写他就是一个没有命名空间的Schema,先不提没有名字的,假设都有名字,没有名字的例子你可以看完这篇自己想一想,道理都一样,具体怎么写的,可以去菜鸟教程搜搜。
xmlns[:xxx]这个属性,就是引入语义用的,一个语义本身也是需要语义的,它的语义官方规定好了的,所以直接赋值就行,就是xmlns:xs="http://www.w3.org/2001/XMLSchema-instance"
,可以看到,这里有了xs这个前缀,它其实等价于这个语义,因为语义(这里提醒一下他是命名空间的意思),一般都是url地址,太长了,所以用这个前缀代替。导入完这个语义后,在这个语义下,可以写这个属性```xs:schemaLocation=“http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd”``因为在xs官网的语义下定义了这个属性,所以可以写这个属性,并且加上官网的前缀。这个属性后面的值,就是第三方的Schema语义,它是由一对,”命名空间“ [空格] ”文件url“,这样来导入的,文件就是Schema,命名空间就是写他的时候给它的定义的语义名字。可以导入N多个,继续按照空格键值对这样的形式往后加就行。不过现在还是不行的,不能使用,想要使用还得用xmlns这个属性往xml文件里导入,因为这个属性只能导入文件,不能导入语义,导入语义还是需要xmlns,为它赋值刚刚导入的键值对的,命名空间-键值,必须是导入过的才能用,不然不能用,在IDEA中这样会出错提示。
另外[:xxx]前缀是可以省略的,省略了,在这个标签内部(被赋值命名空间的标签,一般都在根部)就不用再写前缀了,不过只能有一个xmlns可以省略,原因是,假设多个语义内都有head标签,你在这个xml内想要写head标签,要是有两个xmlns都没有前缀,这俩里面都定义了head标签,那么这个head标签到底属于哪个语义就产生了歧义,如果只有一个就不会,其他的都有自己的前缀,所以可以区分是哪个语义的。