XML 中的 xmlns、xmlns:xsi、xsi:schemaLocation

  在用 Java 开发项目的过程中,少不了使用 xml 配置文件,比如 web.xml、pom.xml、applicationContext.xml 等等。在这些文件中,都会出现 xmlns、xmlns:xsi、xsi:schemaLocation 的设置,它们有什么用?
  在了解 xmlns、xmlns:xsi、xsi:schemaLocation 作用之前,需要了解几个概念

1. 命名空间

 1.1 命名冲突

  在 XML 文件中,由于标签元素的名称是由开发者自己定义的,所以经常会碰到两个不同的文档使用相同的元素名,此时,如果在一个 XML 文档中同时使用这两个文档时,就会发生命名冲突。
  例如,下面的 person 标签就发生了命名冲突。

<person>
	<name></name>
	<score></score>
</h:person>
<person>
	<code></code>
	<salary></salary>
</person>

  类比于 Java 来理解的话,相当于在一个包下,创建了两个类名都为 Person 的类,那么在使用的时候就不知道要用的是那一个了(Eclipse 中根本不允许在一个包创建同名类)。

 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:前缀名="唯一标识"

  1. xmlns —— XML NameSpace 即 XML 命名空间
  2. 唯一标识:一般来讲会使用 URI 的 URL来作为唯一标识
  1. 统一资源标识符(URI,全称 Uniform Resource Identifier),是一串可以标识因特网资源的字符,包括 URL 和 RUN
  2. 统一资源定位器(URL)是用来标识因特网域名地址的统一资源定位器;
  3. 统一资源命名(URN)

PS:
  命名空间的唯一标识不会被解析器用于查找信息。其目的只是为命名空间分配一个惟一的名称。不过,很多公司常常会作为指针来使用命名空间指向实际存在的网页,这个网页包含关于命名空间的信息。
  也就是说,我们完全可以自己定义这个唯一标识,只要它是唯一的就可以,只不过在项目开发中,为了提高可读性,还是推荐使用 url 作为唯一标识

  例如:为 person 标签定义命名空间

<h:person xmlns:f="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="唯一标识"

  在定义了默认命名空间之后使用没有前缀的元素,表示该元素位于默认命名空间之下。

<h: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 文档可以自定义的语法或格式检查器

  了解了这些,再来看看xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"就是在命名空间下创建一个 xsi 前缀,该前缀的唯一标识是"http://www.w3.org/2001/XMLSchema-instance"xsi 已经成为了一个业界默认的用于 XSD(XML Schema Definition) 文件的命名空间.
  xmlns 是命名空间,而 xsi 全称是 XML Schema Instance 的缩写,即 XML Shema 实例.

  现在定义了一个 XML Schema Instance ,接下来就是为XML Schema Instance 提供使用的 XML Schema 地址( schemaLocation),即 xsd 文件全路径,这样 XML 解析器在解析时,会自动到这个路径下下载 xsd 文件,然后根据这个文件去解析 XML 文档的结构是否有误。

   接下来再来看看 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 文件

  • 18
    点赞
  • 65
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值