大家好,欢迎来到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”。
这么一看它们之间看起来好像又有关联?
其实是因为当默认命名空间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://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