说说Spring XML的头

部分内容截取自(http://blog.csdn.net/zhch152/article/details/8191377,http://iswift.iteye.com/blog/1657537)

在使用spring的时候遇到了挺多问题,有些问题很奇怪,比如提示下面的错误:

org.xml.sax.SAXParseException: SchemaLocation: schemaLocation 值 '       
  http://www.springframework.org/schema/jdbc 
http://www.springframework.org/schema/jdbc/spring-jdbc.xsd

http://www.springframework.org/schema/aop ' 必须具有偶数个 URI。

 我第一次遇到这个问题,就有点蒙了,这到底是啥意思,最后对照别人的配置文件才发现少了

http://www.springframework.org/schema/aop/spring-aop.xsd

 完整的应该是:

xsi:schemaLocation="
http://www.springframework.org/schema/jdbc http://www.springframework.org/schema/jdbc/spring-jdbc.xsd       
http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop.xsd"

咱么下面就开始看看这些头文件都代表什么意思。

完整的头文件应该是这样的:

<?xml version="1.0" encoding="UTF-8"?>
<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:jdbc="http://www.springframework.org/schema/jdbc"
       xmlns:aop="http://www.springframework.org/schema/aop"
       xmlns:tx="http://www.springframework.org/schema/tx"
       xsi:schemaLocation="
       http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
       http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx.xsd
       http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd
       http://www.springframework.org/schema/jdbc http://www.springframework.org/schema/jdbc/spring-jdbc.xsd
       http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop.xsd">

<aop:aspectj-autoproxy/> <tx:annotation-driven transaction-manager="transactionManager" order="2"/> <bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager"> <property name="dataSource" ref="dataSource"/> </bean> </beans>

 说明:



第一行就比较简单了,说明这是一个xml文件,相当于告诉解析器这是个XML文档,你需要用XML解析器来进行解析。


第二行开头:beans —— xml文件的根节点。

xmlns(XML Namespaces的缩写),叫做"名字空间"声明。名字空间是什么作用呢?我的理解是:

由于xml允许你自己定义自己的标识,你定义的标识和其他人定义的标识有可能相同,但表示不同的意义。当文件交换或者共享的时候就容易产生错误。为了避免这种错误发生,XML采用名字空间声明,允许你通过一个网址指向来识别你的标识。

比如在一个文档<table>wood table</table>中<table>表示桌子,而在另一个文档<table>namelist</table>中<table>表示表格。如果我需要同时处理这两个文档,就会发生名字冲突。为了解决这个问题,我们引进了namespaces这个概念。namespaces通过给标识名称加一个网址(URL)定位的方法来区别这些名称相同的标识。


Namespaces同样需要在XML文档的开头部分声明,声明的语法如下:
<document xmlns:yourname='URL'>

其中yourname是由你定义的namespaces的名称,URL就是名字空间的网址。
假设上面的"桌子<table>"文档来自http://www.zhuozi.com/,我们就可以声明为
<document xmlns:zhuozi='http://www.zhuozi.com'>

然后在后面的标识中使用定义好的名字空间:
<zhuozi:table>wood table</table>
这样就将这两个<table>区分开来。注意的是:设置URL并不是说这个标识真的要到那个网址去读取,仅仅作为一种区别的标志而已。但是我们用的一些名字空间确实存在很多信息,这些地址真实存在,包含了关于当前命名空间更详细的信息。

其实xmlns就类似于java中的package。


再往下读

第三行:xmlns:xsi ——是指xml文件遵守xml规范,xsi全名:xml schema instance,是指具体用到的schema资源文件里定义的元素所准守的规范。

本xml文件中要用到某些来自xsi代表的“http://www.w3.org/2001/XMLSchema-instance”这个命名空间的元素 ,表示遵守w3的xml schema规范,xml解析器解析xml文件时,就明白按照什么规范解析了。

比如引入自带命名空间的schema文件的schemaLocation="XXX"这些元素。
这些元素是包含在xsi命名空间中的,所有的xml文件只要引用这些元素 就要引入xsi这个命名空间。  
xsi这三个字母不是硬性规定,只是大家都这么用,方便阅读而已。

然后咱们看到了xsi:schemaLocation="“

它是指是指具体用到的schema资源 ,是什么意思呢?用于声明了目标名称空间的模式文档

  http://www.springframework.org/schema/jdbc 
http://www.springframework.org/schema/jdbc/spring-jdbc.xsd

比如上面这个,引入了jdbc的schema。那么我们就可以用jdbc标签了。

再来看下面这句话:

xsi:schemaLocation属性的值由多个URI引用对组成,两个URI之间以空白符分隔。第一个URI是名称空间的名字,第二个URI给出模式文档的位置,模式处理器将从这个位置读取模式文档,该模式文档的目标名称空间必须与第一个URI相匹配。

但是必须引入xsi命名空间!

再来看之前提到的xsi:

声明XML Schema实例名称空间(http://www.w3.org/2001/XMLSchema-instance),并将xsi前缀与该名称空间绑定,这样模式处理器就可以识别xsi:schemaLocation属性。XML Schema实例名称空间的前缀通常使用xsi。

此外,要注意的是,XML Schema推荐标准并没有要求模式处理器必须要使用xsi:schemaLocation属性,某些模式处理器可以通过其他的方式来得到模式文档的位置,而忽略xsi:schemaLocation属性。

原文地址:https://www.cnblogs.com/haolnu/p/7367798.html