XML和Schema中xmlns,targetNamespace和xsi:schemaLocation的关系和作用

XML的命名空间:

在w3c的官方说法中,命名空间提供了避免元素命名冲突的作用,即相同的元素名称表示不同含义的情况。
这里就不再举例详细说明了,在网上很容易找到。如果要避免重名的冲突,那很明显的,在xml文档中就可以出现多个不同的命名空间。
命名空间的语法:
xmlns:namespace-prefix="namespaceURI"
当命名空间被定义在元素的开始标签中时,所有带有相同前缀的子元素都会与同一个命名空间相关联,前缀可以看做是命名空间的一个别名;

xmlns:是默认命名空间。如果不加前缀(namespace-prefix),即为默认命名空间,指定使用该命名空间的元素及子元素只要不加其他前缀,就都是默认命名空间的元素。

XML Schema:

XML Schema是定义 XML文档的合法构建模块,即定义xml文档中可以出现哪些元素、属性、元素之间的关系、顺序、元素的数量、元素或属性的类型和值的范围等等,是对xml文档的一种约束方式。

不过xsd(XML Schema Definition,即XML Schema定义)文档本身也是使用XML语言来写的。所以它也具有xmlns的属性。

下面给出一个简单的xsd文档:

book.xsd



	
	
	
		
			
		
	
	
		
			
			
			
		
		
	
	
		
			
			
		
	
	
targetNamespace:

该属性声明了本XML Schema文档中定义的元素是属于targetNamespace属性指定的命名空间(URI)下的。

有一个现象,在很多xsd文档中会发现,xmlns和targetNamespace指定的命名空间值(URI)是一样的,但其实他们之间的关系并不是固定的。为什么这样说呢?

因为 targetNamespace声明了在该xsd文档下定义的元素属于该命名空间,而 xmlns的作用仅仅是指定默认命名空间

但是,如果在eclipse或idea等IDE工具里,一个xmlns和targetNamespace的URI相同的xsd文档(比如上面给出的book.xsd),将xmlns或targetNamespace修改的不一致,会发现IDE在该xsd文档引用自定义的元素时会报错,如下图,是将上面的文档的targetNamespace修改为“http://www.example.org/book_modify”。


XML和Schema中xmlns,targetNamespace和xsi:schemaLocation的关系和作用_第1张图片

这么一看它们之间看起来好像又有关联?

其实是因为当默认命名空间xmlns和targetNamespace指定的命名空间一致时,在默认命名空间下使用的元素(如:type="booksType")是属于targetNamespace命名空间下的。所以在这种情况下,当只是修改xmlns或者targetNamespace,使两者不一致时,IDE工具会发现在xmlns引用的命名空间下找不到该元素的定义的错误。

当然,也可以将默认命名空间xmlns和targetNamespace给定不一样的值,用另外加了前缀的命名空间引用targetNamespace的命名空间下的元素,这样在使用targetNamespace下定义的元素时需要加上该前缀。如下:

book_modify.xsd



	
	
	
		
			
		
	
	
		
			
			
			
		
		
	
	
		
			
			
		
	
	
XML中使用Schema实例:

这里先给出一个使用book.xsd来约束的xml文件

books.xml



	
		Thinking in Java
		Bruce Eckel
		86.4
	
	
		Head First 设计模式
		Freeman
		64.2
	
	
		深入理解Java虚拟机
		周志明 
		59.2
	

在xml文档中,经常看到 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"这样的命名空间,那它有什么作用呢?

它的作用是告知xml文档解析器,用某个schema实例来验证该xml文档。而且该命名空间的URI

http://www.w3.org/2001/XMLSchema-instance”是一个固定值,这个URI指向一个xsd文档,该xsd的targetNamespace的值就是这个URI。同时在xsd中定义了四个属性,其中有一个属性的名称为:schemaLocation,这个属性在xml文档中也经常用到,如上面的例子中

xsi:schemaLocation="http://www.example.org/book book.xsd"
xsi:schemaLocation的作用:

其语法是:schemaLocation=“{namespaceURI}   {xsd名称}”

前缀xsi是自定义的,不过现在大家都习惯了这个官方的习惯。

其作用是告知解析器,schemaLocation指定的命名空间下的元素要用该xsd的schema来约束。就像该属性的名称的字面意义,确定schema的定位。

但是,如果要让该schema起到作用,需要在xml中使xmlns的URI和该xsd文档的targetNamespace的URI相同。且在schemaLocation中,namespaceURI的值一定要和该xmlns相同,也就是和xsd文件的targetNamespace相同,这样,解析器才能准确的知道在该xmlns下的元素要遵循哪个schema。当然也可以在xmlns后加命名空间的前缀,在该前缀修饰的元素需要遵循该schema的规范。例如:

books_modify.xml



	
		Thinking in Java
		Bruce Eckel
		86.4
	
	
		Head First 设计模式
		Freeman
		64.2
	
	
		深入理解Java虚拟机
		周志明 
		59.2
	

代码在GitHub:https://github.com/likun0121/xmlandschema

参考链接:

https://stackoverflow.com/questions/18475865/targetnamespace-and-xmlns/18476480

https://stackoverflow.com/questions/2615892/is-xmlnsxsi-http-www-w3-org-2001-xmlschema-instance-a-special-case-in-xml

https://blog.csdn.net/yangyuge1987/article/details/59536964

https://stackoverflow.com/questions/5875021/what-is-the-use-of-xsischemalocation

https://stackoverflow.com/questions/16960038/error-while-parsing-xsd-using-xjc

你可能感兴趣的:(XML,Schema)