XML文档中如何引入Schema

时间:2024-03-18 17:40:00

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

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

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

XML文档中如何引入Schema

语法就不说了,这里主要解释一下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文件

XML文档中如何引入Schema

   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文件


   最后,附上几种截图

XML文档中如何引入Schema


XML文档中如何引入Schema

XML文档中如何引入Schema


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

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

XML文档中如何引入Schema






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



本文转自    手不要乱摸      51CTO博客,原文链接:

http://blog.51cto.com/5880861/1412883