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

XML和Schema中xmlns,targetNamespace和xsi:schemaLocation的关系和作用本文主要说明XMLSchema中的xmlns,targetNamespace和的作用和关系。同时对xml中的xmlns和常见的xsi:schemaLocation的作用加以解释。

大家好,欢迎来到IT知识分享网。

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

<?xml version="1.0" encoding="UTF-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" 
		targetNamespace="http://www.example.org/book"
		xmlns="http://www.example.org/book" 
		elementFormDefault="qualified">
	
	<xs:element name="books" type="booksType"/>
	<xs:complexType name="booksType">
		<xs:sequence>
			<xs:element name="book" type="bookType" maxOccurs="unbounded"/>
		</xs:sequence>
	</xs:complexType>
	<xs:complexType name="bookType">
		<xs:sequence>
			<xs:element name="name" type="xs:string"/>
			<xs:element name="author" type="xs:string"/>
			<xs:element name="price" type="priceType"/>
		</xs:sequence>
		<xs:attribute name="id" type="xs:string" use="required"/>
	</xs:complexType>
	<xs:simpleType name="priceType">
		<xs:restriction base="xs:decimal">
			<xs:minExclusive value="0"/>
			<xs:maxInclusive value="500"/>
		</xs:restriction>
	</xs:simpleType>
	
</xs:schema>
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的关系和作用

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

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

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

book_modify.xsd

<?xml version="1.0" encoding="UTF-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" 
		xmlns="http://www.example.org/other" 
		targetNamespace="http://www.example.org/book"
		xmlns:bo="http://www.example.org/book"
		elementFormDefault="qualified">
	<!-- 
		将xmlns定义为其他值。
		增加新的命名空间xmlns:bo="http://www.example.org/book",其值是targetNamespace的URI。
		这样,要是使用在targetNamespace下定义的元素,需要使用前缀bo。
	-->
	<xs:element name="books" type="bo:booksType"/><!-- 使用了bo前缀 -->
	<xs:complexType name="booksType">
		<xs:sequence>
			<xs:element name="book" type="bo:bookType" maxOccurs="unbounded"/><!-- 使用了bo前缀 -->
		</xs:sequence>
	</xs:complexType>
	<xs:complexType name="bookType">
		<xs:sequence>
			<xs:element name="name" type="xs:string"/>
			<xs:element name="author" type="xs:string"/>
			<xs:element name="price" type="bo:priceType"/><!-- 使用了bo前缀 -->
		</xs:sequence>
		<xs:attribute name="id" type="xs:string" use="required"/>
	</xs:complexType>
	<xs:simpleType name="priceType">
		<xs:restriction base="xs:decimal">
			<xs:minExclusive value="0"/>
			<xs:maxInclusive value="500"/>
		</xs:restriction>
	</xs:simpleType>
	
</xs:schema>
XML中使用Schema实例:

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

books.xml

<?xml version="1.0" encoding="UTF-8"?>
<books xmlns="http://www.example.org/book"
	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xsi:schemaLocation="http://www.example.org/book book.xsd">
	<book id="1001">
		<name>Thinking in Java</name>
		<author>Bruce Eckel</author>
		<price>86.4</price>
	</book>
	<book id="1002">
		<name>Head First 设计模式</name>
		<author>Freeman</author>
		<price>64.2</price>
	</book>
	<book id="1003">
		<name>深入理解Java虚拟机</name>
		<author>周志明 </author>
		<price>59.2</price>
	</book>
</books>

在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

<?xml version="1.0" encoding="UTF-8"?>
<m:books xmlns:m="http://www.example.org/book"
	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xsi:schemaLocation="http://www.example.org/book book.xsd">
	<m:book id="1001">
		<m:name>Thinking in Java</m:name>
		<m:author>Bruce Eckel</m:author>
		<m:price>86.4</m:price>
	</m:book>
	<m:book id="1002">
		<m:name>Head First 设计模式</m:name>
		<m:author>Freeman</m:author>
		<m:price>64.2</m:price>
	</m:book>
	<m:book id="1003">
		<m:name>深入理解Java虚拟机</m:name>
		<m:author>周志明 </m:author>
		<m:price>59.2</m:price>
	</m:book>
</m:books>

代码在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

免责声明:本站所有文章内容,图片,视频等均是来源于用户投稿和互联网及文摘转载整编而成,不代表本站观点,不承担相关法律责任。其著作权各归其原作者或其出版社所有。如发现本站有涉嫌抄袭侵权/违法违规的内容,侵犯到您的权益,请在线联系站长,一经查实,本站将立刻删除。 本文来自网络,若有侵权,请联系删除,如若转载,请注明出处:https://yundeesoft.com/23732.html

(0)

相关推荐

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注

关注微信