XML:命名空间

567 阅读4分钟

1.命名空间的相关概念

1.1 命名冲突

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

<person>
    <name></name>
    <age></age>
</persion>
<person>
    <class></class>
    <scole></scole>
</person>

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

1.2 前缀

XML 在解决命名冲突的时候,首先引入了前缀的概念,相同名的标签,使用前缀名来区分

<h:person>
    <name></name>
    <age></age>
</h:persion>
<f:person>
    <class></class>
    <scole></scole>
</f:person>

类比于 Java 来理解的话,相当于在一个包下,分别创建了 HPerson 类和 GPerson 类,避免了命名冲突。

1.3 命名空间

命名空间是在元素的开始标签的xmlns属性中定义的。PS:一般会将命名空间的定义放在根元素的属性上定义。 命名空间声明的语法是xmlms:前缀名="唯一标识"。
1.xmlns——XML NameSpace 即XML命名空间
2.唯一标识:一般来讲会使用URI的URL来作为唯一标识

1.统一资源标识符(URI,全称Uniform Resource Identifier),是一串可以标识因特网资源的字符,包括URL和RUN
2.统一资源定位器(URL)是用来标识因特网域名地址的统一资源定位器
3.统一资源命名(URN)
PS:
命名空间的唯一标识不会被解析器用于查找信息。其目的只是为命名空间分配一个惟一的名称。不过,很多公司常常会作为指针来使用命名空间指向实际存在的网页,这个网页包含关于命名空间的信息。   也就是说,我们完全可以自己定义这个唯一标识,只要它是唯一的就可以,只不过在项目开发中,为了提高可读性,还是推荐使用 url 作为唯一标识

命名空间的概念可以类比于 Java 中的包来理解,比如上面的代码是创建了一个名为 h 的包,在这个包下创建了一个 Person 类,Person 类中的变量是 name 和 score,这样每次在使用的时候,都是用 h.Person 来表示使用的是 h 包下的 Person 类。   在子元素的开始标签中定义命名空间就可以类比为 Java 中创建子包。不过不太推荐在子元素上定义命名空间

  在元素的开始标签中定义了命名空间之后时,所有带有相同前缀的子元素表示位于同一个命名空间中。

1.4 默认命名空间

对于xml命名空间还有一个定义——默认命名空间。
默认命名空间的语法省略了命名空间定义时的前缀:xmlns="唯一标识"
在定义了默认命名空间之后使用没有前缀的袁术,表示该元素位于默认命名空间之下。

<h:persion xmlns="http://www.w3school.com.con/furniture">
    <name></name>
    <score></score>
</persion>

明白了默认命名空间,也就知道了XML中的xmlns的意思了,就是定义了一个默认命名空间,在之后使用的元素,所有没有前缀的都是默认命名空间的元素。

总结

在使用 XML 的时候,我们会用一些别人定义好功能的标签,但是我们还没有告诉 XML 的解析器,我们是如何定义的文档结构,传统方式会用 DTD (文档类型定义) 文件来定义标签,只需要引入这个 DTD 文件,解析器即可判断文件结构了。   引入 DTD 文件使用的 DOCTYPE 声明,HTML 文件就是使用 DOCTYPE 声明引入的 DTD 文件,不过 HTML5 中是不显示的 了解了这些,再来看看xmlns:xsi="www.w3.org/2001/XMLSch… xsi 前缀,该前缀的唯一标识是"www.w3.org/2001/XMLSch… 已经成为了一个业界默认的用于 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 = "key" "value",前面的 key 就是我们在定义命名空间时赋的值,而后面的 value 则是需要使用的 xsd 文件 URL,XML 解析器在解析时就会去这个 URL 去获取 xsd 文件的内容,根据这个内容解析 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=www.springframework.org/schema/bean…, xmlns 的值可以随便改,只要是唯一的就行,如果更改了这里的值,下面的xsi:schemaLocation中的也要修改为对应的值。   xmlns:context="www.springframework.org/schema/cont… context 的命名空间,使用 context 下的元素,需要加上 context 前缀。   xmlns:xsi="www.w3.org/2001/XMLSch… xsi 命名空间,可以通过xsi:schemaLocation来定义 xsd 文件的位置,以便 XML 解析器解析 XML 文件