在 Java 开发中,免不了使用 xml 文件,比如 mybatis.xml、pom.xml等。在这些文件的最外层标签属性中,都会出现 xmlns、xmlns:xsi、xsi:schemaLocation ,那么它们有什么用呢?
接下来我们逐步了解这些概念
一、命名空间
1.1 命名冲突
在 XML 文件中,由于标签元素的名称是由开发者自己定义的,所以经常会碰到两个不同的文档使用相同的元素名,此时,如果在一个 XML 文档中同时使用这两个文档时,就会发生命名冲突。
例如,下面的 person 标签就发生了命名冲突。
<person>
<name></name>
<score></score>
</person>
<person>
<code></code>
<salary></salary>
</person>
类比于 Java 来理解的话,相当于在一个包下,创建了两个类名都为 Person 的类,那么在使用的时候就不知道要用的是那一个了。
1.2 前缀
XML 在解决命名冲突的时候,首先引入了前缀的概念,相同名的标签,使用前缀名来区分。
例如,下面的代码中,使用前缀来区分不同的 person 标签,避免了命名冲突。
<h:person>
<h:name></h:name>
<h:score></h:score>
</h:person>
<g:person>
<g:code></g:code>
<g:salary></g:salary>
</g:person>
类比于 Java 来理解的话,相当于在一个包下,分别创建了 HPerson 类和 GPerson 类,避免了命名冲突。
1.3 命名空间
命名空间是在元素的开始标签的 xmlns 属性中定义的。PS:一般会将命名空间的定义放在根元素的属性上定义。
命名空间声明的语法是 xmlns:前缀名={唯一标识}
。
xmlns —— XML NameSpace 即 XML 命名空间
唯一标识:一般来讲会使用 URI 的 URL来作为唯一标识
统一资源标识符(URI,全称 Uniform Resource Identifier),是一串可以标识因特网资源的字符,包括 URL 和 RUN
统一资源定位器(URL)是用来标识因特网域名地址的统一资源定位器;
统一资源命名(URN)
PS:命名空间的唯一标识不会被解析器用于查找信息。其目的只是为命名空间分配一个惟一的名称。不过,很多公司常常会作为指针来使用命名空间指向实际存在的网页,这个网页包含关于命名空间的信息。
也就是说,我们完全可以自己定义这个唯一标识,只要它是唯一的就可以,只不过在项目开发中,为了提高可读性,还是推荐使用 url 作为唯一标识。
例如:为 person 标签定义命名空间
<h:person xmlns:h="http://www.w3school.com.cn/furniture">
<h:name></h:name>
<h:score></h:score>
</h:person>
命名空间的概念可以类比于 Java 中的包来理解,比如上面的代码是创建了一个名为 h 的包,在这个包下创建了一个 Person 类,Person 类中的变量是 name 和 score,这样每次在使用的时候,都是用 h.Person 来表示使用的是 h 包下的 Person 类。
在子元素的开始标签中定义命名空间就可以类比为 Java 中创建子包。不过不太推荐在子元素上定义命名空间。
在元素的开始标签中定义了命名空间之后时,所有带有相同前缀的子元素表示位于同一个命名空间中。
1.4 默认命名空间
对于xml命名空间还有一个定义——默认命名空间。
默认命名空间的语法省略了命名空间定义时的前缀:xmlns="唯一标识"
在定义了默认命名空间之后使用没有前缀的元素,表示该元素位于默认命名空间之下。
<person xmlns="http://www.w3school.com.cn/furniture">
<name></name>
<score></score>
</person>
明白了默认命名空间,也就知道了 XML 文件中的 xmlns 的意思了,就是定义了一个默认命名空间,在之后使用的元素,所有没有前缀的都是默认命名空间中的元素。
二、如何声明文档结构
在使用 XML 的时候,我们会用一些别人定义好功能的标签,但是我们还没有告诉 XML 的解析器,我们是如何定义的文档结构。传统方式会用 DTD (文档类型定义) 文件来定义标签,只需要引入这个 DTD 文件,解析器即可判断文件结构了。
引入 DTD 文件使用的 DOCTYPE 声明,HTML 文件就是使用 DOCTYPE 声明引入的 DTD 文件,不过 HTML5 中是不显示的。
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
不过目前比较主流的是使用 W3C 支持的一种基于 XML 的 DTD 代替者,它的文件是 xsd (XML Schema Definition), XML 解析器可以根据 一个 XSD 文件的内容来解析另一个 XML 文件, 判断该文件的结构是否和 XSD 文件中定义的一致。 XSD 文件 可以理解为 XML 文档可以自定义的语法或格式检查器
了解了XSD 文件,再来看看xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
就是在命名空间下创建一个 xsi 前缀,该前缀的唯一标识是"http://www.w3.org/2001/XMLSchema-instance",xsi 已经成为了一个业界默认的用于声明 XSD文件的命名空间,一般不会修改.
xmlns 是命名空间,而 xsi 全称是 XML Schema Instance的缩写,即 XML Shema 实例.
现在定义了一个 XML Schema Instance
,接下来就是为XML Schema Instance
提供使用的 XML Schema 地址( schemaLocation),即 xsd 文件全路径,这样 XML 解析器在解析时,会自动到这个路径下下载 xsd 文件,然后根据这个文件去解析 XML 文档的结构是否有误。
三、xsi:schemaLocation
最后再来看看 xsi:schemaLocation
的作用
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd"
xsi:schemaLocation
的语法其实是键值对的用法, xsi:schemaLocation = "{key} {value}"
,前面的 key 就是我们在定义命名空间时赋的值,而后面的 value 则是需要使用的 xsd 文件 URL,XML 解析器在解析时就会去这个 URL 去获取 xsd 文件的内容,根据这个内容解析 XML 文件
下面以一个 bean.xml 文件为例
<beans
xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:util="http://www.springframework.org/schema/util"
xsi:schemaLocation="
http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context.xsd
http://www.springframework.org/schema/util
http://www.springframework.org/schema/util/spring-util.xsd">
</beans>
xmlns="http://www.springframework.org/schema/beans"
就是定义了一个默认命名空间, xmlns 的值可以随便改,只要是唯一的就行,如果更改了这里的值,下面的xsi:schemaLocation中的也要修改为对应的值。xmlns:context="http://www.springframework.org/schema/context"
就是定义了一个 context 的命名空间,使用 context 下的元素,需要加上 context 前缀。xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
,创建了一个 xsi 命名空间,可以通过xsi:schemaLocation
来定义 xsd 文件的位置,以便 XML 解析器解析 XML 文件xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd"
就是为命名空间http://www.springframework.org/schema/beans
定义了格式, 其格式读取http://www.springframework.org/schema/beans/spring-beans.xsd
文件