接触XML有一段日子了,但一直都是复制粘贴,或者照着例子写,没有真正地理解。
今天,又温习了一下XML,有种陌生又熟悉的感觉。。。
言归正传,先看一个简单的schema文件(05.xsd)
<a href="http://s3.51cto.com/wyfs02/M01/28/49/wKiom1N2-rDDc1m2AAJXx-6A0D0977.jpg" target="_blank"></a>
语法就不说了,这里主要解释一下schema元素的前三个属性:
接下来,在看如何在xml文档中引用这个schema文件
<a href="http://s3.51cto.com/wyfs02/M02/28/49/wKiom1N2_gTzE-BeAAF_HoYEQ1A396.jpg" target="_blank"></a>
我当时有一个疑问:schema文件中声明的targetNamespace、xml文档中的xmlns、xml文档中引用的schema文件的命名空间(即schemaLocation属性中的写的那个)这三者之间有什么关联呢?
后来,我发现schemaLocation中指定的命名空间要和这个被引用的schema文件中声明的targetNamespace相同,xml会在这个schema文件中找这个指定的命名空间中所定义的元素规则。原来如此,这一点好理解,但是我试过在xml文档中声明的命名空间和它所引用schema时指定的命名空间不同也不能正确校验。比如:上面这个例子中,我不写xmlns或者将它写成xmlns="http://www.example.org/08"都不能到达校验的目的,总是有一个警告:No grammar constraints (DTD or XML schema) detected for the document.
经过一番思考,我终于想通了。关键在于定义schema文件时targetNamespace属性,这个属性指明在这个schema文件中定义的元素(注意:是定义的元素。对于上面的例子来说,name和birthday才是定义的元素,像element、complexType等不是这里所说的定义的元素。)都来自targetNamespace所指定的这个命名空间。在xml文档中引用了这个schema文件,如何不定义命名空间或者声明的命名空间和schema定义的元素的命名空间不同就无法验证,xml文档中元素在一个命名空间,而schema在另一个命名空间,不可能用A命名空间下的校验规则去校验B命名空间下的元素。例子中只引入了一个schema文件,其实可以引用多个的,这里不作介绍。
接着,说一说在xml文档中引入schema文件
有两个属性是做这个事的:schemaLocation和noNamespaceSchemaLocation
noNamespaceSchemaLocation属性引用没有命名空间的schema文件
schemaLocation属性引用有命名空间的schema文件
最后,附上几种截图
<a href="http://s3.51cto.com/wyfs02/M00/28/49/wKiom1N3CHqjvch7AAiKWSTLivk214.jpg" target="_blank"></a>
<a href="http://s3.51cto.com/wyfs02/M02/28/49/wKioL1N3CLSTNo9_AAMym-G-4QQ909.jpg" target="_blank"></a>
<a href="http://s3.51cto.com/wyfs02/M01/28/49/wKiom1N3CODRC6jfAAKQEJc8MBg383.jpg" target="_blank"></a>
小结:xml声明的元素的命名空间要和被引用的schema文件的命名空间相匹配才能达到校验的效果。
现在,回头再看spring的配置文件,有种莫名的喜悦。。。
<a href="http://s3.51cto.com/wyfs02/M01/28/49/wKiom1N3Crugr0jsAASIc9fTUTA641.jpg" target="_blank"></a>
本文转自 手不要乱摸 51CTO博客,原文链接:
http://blog.51cto.com/5880861/1412883