xml 知识总结: xsd,xsi:schemaLocation,xmlns,xmlns:xsi
1、xmlns是一个属性名,意思是xml namespace,ns是namespace的缩写
2、xmlns属性写在xml的根标签上
3、同一个xml文件里头,除了xmlns这个默认命名空间,还可以定义其他,比如最常见的是xmlns:xsi
- 可以有其他非默认命名空间,也可以仅有xmlns默认命名空间,根据需要
- 仅有xmlns默认命名空间的例子:这种平时少见,但问过AI,肯定是存在的
- 多个命名空间的例子:非常多,如上面的截图
- 也有没有任何命名空间的情况,读完这篇文章,后面有
4、默认的命名空间不加 ":shortName",如果一个xml文件中有多个命名空间,只能有一个默认的(即xmlns),其他的就得起一个别名,格式是 "xmlns:别名",eg: xmlns:xsi
5、xmlns:xsi 中的 xsi 是自己定义的名字,可自定义成别的值,如 xmlns:foobar,只是 xsi 是约定俗成,因为xsi是XML Schema Instance 的缩写
- 如果用了 xmlns:foobar,那 xsi:schemaLocation 属性就得改成 foobar:schemaLocation
- 假设这个 xml 中还用了 xsi 下的标签,比如 <xsi:qwert>,如果命名空间改成foobar,即 xmlns:foobar,同样标签要改前缀,改成 <foobar:qwert>
6、在一个xml中,是可以出现来自不同命名空间的标签的(少见,但确实存在)
- 比如xml文件中同时存在<example>和<foobar:qwert>。 <example>是在默认的命名空间(xmlns)下的标签,<foobar:qwert> 是 xmlns:foobar 的命名空间下的标签
- 再次强调,同一个xml文件多个命名空间,不仅仅体现在属性上,也体现在标签上。
- 体现在属性常见的是 xsi:schemaLocation 这种所定义的属性不在默认命名空间下、需要指定命名空间的
- 也可以体现在标签:同一个文件出现有无前缀和有前缀的标签 <example>和<foobar:qwert>
一个例子,<bean>标签是默认空间的,非默认空间的得加前缀:
7、xmlns 或 xmlns:xxx 的值通常是一个网址,为什么是一个网址,能不能是其他值比如 xmlns="abcdef"?
- 是网址是约定俗成,网址也不容易重复,网址也有一定含义
- 使用 xmlns="abcdef" 是可以的,当然可能会冲突,最主要是不符合约定俗成的规范
8、xmlns 或 xmlns:xxx 的网址需要网络能访问通吗?
- 不需要,本质就是一个字符串
9、xsi:schemaLocation 的作用
- 作用是告诉xml解析器去哪里下载这个xsd文件
- xsd文件的网址一般是要能访问通的,我就遇到过访问不通导致报错的情况(是强迫你一定要解决的错误而不仅仅是提醒)。但也不绝对,可能解析器配置不校验就不会有错。
- xsd文件就是xml的语法校验器
10、xsi:schemaLocation 的格式:{命名空间URL 1} {xsd的网址 1} {命名空间URL 2} {xsd的网址 2}
- "命名空间" 和 "xsd的网址" 是一对,注意顺序,有一对就写一对,有多少对就写多少对,总之要成对出现
- 这里的 "命名空间" 就不是简写了,是一个URL的长串,不能是 "default xsd_url_1 xsi xsd_url_2" 或 "xsd_url_1 xsi xsd_url_2" (省略default并要求必须先写默认的),为什么?没有为什么。
- "命名空间" 和 "xsd的网址" 之间都要有空格或换行符(一个空格、两个空格多少个空格,我估计都可以,甚至tab制表符我猜测也可以)
- 一对 "命名空间" 和 "xsd的网址" 和另一对之间也是用空格或换行符隔开
- xsd文件的网址一般是要能访问通的,我就遇到过访问不通导致报错的情况(是强迫你一定要解决的错误而不仅仅是提醒)。但也不绝对,可能解析器配置不校验就不会有错。
11、xml文件的头(或者叫声明,XML声明 (XML Declaration))
- 一般都会有 <?xml version="1.0" encoding="UTF-8"?>,有时候是 <?xml version="1.0" encoding="UTF-8" standalone="no"?>
12、有些xml文件没有XML声明,是不规范的,但也不一定就会出错,总之万无一失要加上
13、<?xml version="1.0" encoding="UTF-8"?> 和 <?xml version="1.0" encoding="UTF-8" standalone="no"?> 有区别吗?
没区别,standalone默认是no的值,可以不写
14、XML声明中的versison有其他版本号吗?
- 很少见,目前1.0最多,也有1.1 (可以认为没有1.1,因为1.1引入的新问题导致不被接受)
15、XML声明中的 encoding 除了UTF-8 还有其他吗?
- 估计有,但这问题没意义,就照抄 UTF-8 就好了
16、有时候有些xml文件压根就没有 xmlns/ xmlns:xsi / xsi:schemaLocation 这些,其实也挺常见的,也没什么问题
例子,下载tomcat,解压,看到 conf/web.xml 就是没有的:
17、其实可以发现,xsi:schemaLocation 里头的namespace的URL,其实都是在定义namespace的时候出现过的,比如下图
下面的图特殊,xsi:shemaLocation只是出现了2个namespace的URL,并不是3个,这文件定义了3个namespace,其中 xmlns:xsi 的路径并没有出现在xsi:shemaLocation里头
18、xsd和dtd
两者都是用来描述xml文件有什么标签、标签有什么属性、属性值的类型等等的,是xml的"语法"。但是xsd更强大灵活,是现在的主流,dtd的例子也有,就是xhtml里头
19、使用dtd而不是xsd的一个例子,xhtml
下面是一些例子,常见的xml
------------------------------------------------------------------------------------------------
springboot 的 pom.xml
liquibase 的 (可以看到又去的现象,爆红,先不追究原因,大概应该是下载不了这个导致的)
liquibase 的另一个例子,定义了3个namespace: xmlns、xmlns:ext、xmlns:xsi
tomcat 解压缩后 conf/web.xml
tomcat 解压后 conf/server.xml (这个就没有xmlns之类的)
tomcat 解压后 conf/context.xml (没有xmlns之类的)
logback-spring.xml (也没有xmlns之类的,虽然可能你会说这个可能是你自己删掉的,但其他例子,上面的例子,尤其是官网下载的tomcat解压出来的文件已经足够证明 "存在xml文件没有xmlns之类的在根标签" 是存在的现象)
一个例子:在一个xml文件里头除了默认的标签,还用了非默认的标签,得加前缀