XML文档中如何引入Schema

前端之家收集整理的这篇文章主要介绍了XML文档中如何引入Schema前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。

接触XML有一段日子了,但一直都是复制粘贴,或者照着例子写,没有真正地理解。

今天,又温习了一下XML,有种陌生又熟悉的感觉。。。

言归正传,先看一个简单的schema文件(05.xsd)

wKiom1N2-rDDc1m2AAJXx-6A0D0977.jpg

语法就不说了,这里主要解释一下schema元素的前三个属性

1. xmlns="http://www.w3.org/2001/XMLSchema"

声明默认的命名空间,表示这个schema文件中的所使用的元素和数据类型都来自 http://www.w3.org/2001/XMLSchema这个命名空间

2. targetNamespace="http://www.example.org/05"

http://www.example.org/05这个命名空间

3. xmlns:tns="http://www.example.org/05"

表示对http://www.example.org/05这个命名空间中所定义的元素的引用,在这个文档中所有对这个命名空间中定义的元素的引用都要加tns前缀


接下来,在看如何在xml文档中引用这个schema文件

wKiom1N2_gTzE-BeAAF_HoYEQ1A396.jpg

xsi:schemaLocation="http://www.example.org/05 05.xsd"这句话告诉xml到05.xsd文件中找http://www.example.org/05这个命名空间,这句话就在当前xml文件中引入了schema文件05.xsd。


我当时有一个疑问: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文件


最后,附上几种截图

wKiom1N3CHqjvch7AAiKWSTLivk214.jpg


wKioL1N3CLSTNo9_AAMym-G-4QQ909.jpg

wKiom1N3CODRC6jfAAKQEJc8MBg383.jpg


小结:xml声明的元素的命名空间要和被引用的schema文件的命名空间相匹配才能达到校验的效果

现在,回头再看spring的配置文件,有种莫名的喜悦。。。

wKiom1N3Crugr0jsAASIc9fTUTA641.jpg


参考:http://msdn.microsoft.com/zh-cn/library/ms256139(v=vs.80).aspx

猜你在找的XML相关文章