schema约束文档与xml文件详解

1.前言

 写这篇文章的目的是为了不要让自己知其然而不知其所以然.网上看了几篇博客后觉得有点乱,自己整理一下以供回顾.
 XML和Schema具有无关平台,技术厂商,简单,规范统一等特点,极具开放性,所以使用极为广泛,而且使用简单.
 名称空间是W3C推荐标准\提供的一种统一命名XML文档中的元素和属性的机制。使用名称空间可以明确标识和组合XML文档中来自不同标记词汇表的元素和属性,避免了名称之间的冲突。
 使用过DTD的人应该知道,命名冲突是DTD的一大问题,而Schema里引入了命名空间的概念,就很好的解决了这个问题。
 先暂时这么理解:.xsd文件中除了文档声明,它的根标签是<schema.>标签,而xml文档中的根标签是他引用的其他schema文件中自定义的根元素

2.schema约束文档(.xsd文件)

先看两个schema约束文档
自定义的schema约束文档:
在这里插入图片描述
Spring官方定义的schema文档:
在这里插入图片描述
 仔细观察两张图片中的内容就会发现几处不同点,下面详细解释自定义schema文档中的内容,解释完了就能理解Spring的schema文档.

2.1 targetNameSpace

targetNameSpace:定义名称空间(名称空间又叫命名空间),将当前自定义的schema文档与这个名称空间绑定,方便后面的.xml文件引用.

2.2官方文档与自定义文档的关系

"http://www.w3.org/2001/XMLSchema"名称空间是W3C提供的,是所有自定义schema都要遵守的约束规范.其中定义了schema,element, attribute, complexType, group, simpleType等元素,自定义文档中使用这些元素来定义新的元素,属性等.

2.3 声明名称空间

 名称空间声明的一般形式为:第一部分是一个关键字xmlns:,第二部分是名称空间的前缀(别名),第三部分是一个等号,第四部分是双引号,将第五部分的名称空间标识URI包括起来。需要注意的是,名称空间的前缀不能为xml,因为在XML中这个字符串是保留作特殊用途的。如下:
xmlns:tns=“http://www.whtest.com/” //其中tns为前缀。(显示声明)
还可以隐式声明名称空间,即省略掉冒号和名称空间前缀。例:
xmlns=“http://www.whtest.com/” //注意在一个文档中只能有一个隐式声明的命名空间
声明名称空间的作用:在引用当前schema文档的.xml文件中可以使用<前缀:元素></前缀:元素>来使用schema文档中定义的元素,避免了元素名冲突的问题.注意,隐式声明的名称空间使用其中定义的元素时可以直接<元素></元素>.这样就能理解两张图中对schema标签用法的不同.
 schema文档中只会声明两个名称空间,一个是: “http://www.w3.org/2001/XMLSchema” 官方(一般隐式声明)
另一个是targetNameSpace绑定的名称空间(一般显示声明)
xml文件中声明名称空间的方式相同.

2.4 schema文档中的全局成分与非全局成分

全局成分:全局成分指的是元素xsd:schema的直接子节点,包括元素声明、属性声明、复杂/简单类型定义、组定义、属性组定义。
在这里插入图片描述非全局成分:百度了半天都不知道是个什么东西.总之,有时希望将非全局成分定义在目标空间中去,可使用下面方法。
在这里插入图片描述
属性elementFormDefault的默认值是unqualified,也就是规定了只有全局成分才被定义在目标名称空间中。将elementFormDefault的值赋为qualified,使得目标名称空间包含非全局的元素定义。同样,使属性attributeFormDefault的值赋为qualified,可使得目标名称空间包含非全局属性定义。如下:
在这里插入图片描述
这样大致就对schema文档有了一个完整的概念.

2.5 完整的自定义schema文档

<?xml version="1.0" encoding="UTF-8"?>
<schema xmlns="http://www.w3.org/2001/XMLSchema" 
	targetNamespace="http://www.example.org/book" 
	xmlns:tns="http://www.example.org/book" 
	elementFormDefault="qualified">
	
    <!-- 每一个元素对应一个element标签 -->
	<element name="books">
		
        <!-- 包含子元素或属性的元素被称为 `复杂元素` -->
		<complexType>
			
            <!-- 强调子元素出现的顺序 -->
			<sequence>
				<element name="book" minOccurs="1" maxOccurs="unbounded">
					<complexType>
						<sequence>
							<!-- 对于拥有内容的元素, 需要编写 type 属性 -->
							<element name="name" type="string"></element>
							<element name="price" type="string"></element>
						</sequence>
                        
					<!-- book 标签有 author 属性, 类型是字符串, 该属性必须填写 -->
					<attribute name="author" type="string" use="required"></attribute>					
					</complexType>	
				</element>			
			</sequence>
            
		</complexType>
	</element>
</schema>

3.xml文件

先看一下Spring的配置文件applicationContext.xml
在这里插入图片描述

3.1 声明名称空间

 xml中声明名称空间的方式与schema文档中一样,但是xml文件中会声明多个名称空间(引用了多个schema时)

3.2 xml中名称空间使用的范畴

 在XML中,名称空间的使用涉及范畴的概念,范畴即名称空间的覆盖范围,它指的是哪些元素和属性在该名称空间中,哪些不在该名称空间中。名称空间既可以限定整个XML文档,也可以只针对XML文档中的一部分。
1.名称空间限制整个xml文档:

<?xml version=1.0?>
<member_details xmlns=”http://www.testns.com/ns.xsd”>
   <name>Tom</name>
   <age>12</age>
   <sex>male</sex>
</member_details

2.名称空间只针对XML文档中的一部分

<?xml version=1.0?>
<member_details>
   <name xmlns=”http://www.testns.com/ns.xsd”>Tom</name>
   <age>12</age>
   <sex>male</sex>
</member_details

3.嵌套的命名空间
下面展示一些 内联代码片

<?xml version=1.0?>
<member_details xmlns=”http://www.testns.com/ns.xsd”
xmlns:newns=”http://www.testns/newns.xsd”>
   <name>Tom</name>
   <age>12</age>
   <newns:sex>male</sex>
</member_details>
一般都xml中都使用这种方式避免命名冲突,其中只有sex元素使用的是newns.xsd中定义的内容

3.3 schemaLocation

 在了解schemaLocation之前,先了解一下在xml文件中声明的一个名称空间:
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"这句话创建了一个可以引入其他schema文件的命名空间.
 schemaLocation 属性引用具有目标名称空间的 XML 架构文档(引用schema文档,因为schema本质也是xml)。该xml文件中用到的所有新创的元素、属性等的.xsd文件都必须在这里声明。
<xsi:schemaLocation=“list of anyURI” >

 其中的anyURI是一个架构位置,该架构包含限定的(具有名称空间的架构)架构构造。每一对中的第一个 URI 引用是名称空间名称,第二个则是描述名称空间的架构的位置。

将具有目标名称空间的架构文档与实例文档相关联。可以列出多对 URI 引用,每一对都有不同的名称空间名称部分。
根据万维网联合会 (W3C) XML 架构建议,XML 实例文档可以同时指定 xsi:schemaLocation 和 xsi:noNamespaceSchemaLocation 属性。此外,还可以多次列出同一个命名空间。如图:
在这里插入图片描述

3.4 noNamespaceSchemaLocation

 noNamespaceSchemaLocation 属性引用没有目标名称空间的 XML 架构文档。
<xsi:noNamespaceSchemaLocation=“anyURI” >
与SchemaLocation相同anyURI是一个架构位置,该架构包含非限定的(没有名称空间的架构)架构构造。
 不要求 XML 架构有名称空间。若要为没有目标名称空间的 XML 架构指定位置,请使用 noNamespaceSchemaLocation 属性。此属性中引用的 XML 架构不能有目标名称空间。因为此属性不接受 URL 列表,所以只能指定一个架构位置。
 根据万维网联合会 (W3C) XML 架构建议,XML 实例文档可以同时指定 xsi:schemaLocation 和 xsi:noNamespaceSchemaLocation 属性。
下面展示一些 内联代码片

<?xml version="1.0" encoding="UTF-8"?>
<book:books xmlns:book="http://www.example.org/02"
	  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	  xsi:noNamespaceSchemaLocation="02.xsd">
	<book:book id="1">
		<book:title>Java in action</book:title>
		<book:content>Java is good</book:content>
		<book:author>Bruce</book:author>
	</book:book>
</book:books>

3.5 官方schema,自定义schema,xml之间的关系

在这里插入图片描述
官方文档:"http://www.w3.org/2001/XMLSchema
自定义文档schema:声明官方文档后,在其基础上自定义新的元素,属性等
xml:可引入多个自定义文档

4.感谢

写这篇文章,参考了https://blog.csdn.net/wanghuan203/article/details/9203621//中的许多内容,在此表示感谢.虽然有我看了很多遍才懂.稍微调侃一下.88

猜你喜欢

转载自blog.csdn.net/weixin_43179522/article/details/105745581
今日推荐