`
code727
  • 浏览: 66760 次
  • 性别: Icon_minigender_1
  • 来自: 成都
社区版块
存档分类
最新评论

XML文档约束之Schema

阅读更多

        与DTD(http://code727.iteye.com/blog/1882877)相比较,Schema是另一种灵活但复杂的XML约束方式。它主要增加了更多的数据类型和结构模式来改进DTD,并使用XML作为约束格式描述。

       

1.定义Schema约束规则

       下面结合一个实例来说明怎样设计Schema约束。
        例如,在一个XML文档(templet_test.xml)中,其根元素为templet,它包含的元素结构如下:
<?xml version="1.0" encoding="UTF-8"?>

<templet>
		 
	<bean name="user" class="com.daniele.appdemo.test.domain.User">
		<property name="id" type="java:long"/>
		<property name="name" type="java:string" />
		<property name="age" type="java:integer"/>
		<property name="mail" type="java:string" />
		<property name="company" ref="company" />
	</bean>
	
	<bean name="company" class="com.daniele.appdemo.test.domain.Company"></bean>
	
	<description date="2013-06-07">This is a XML Schema example.</description>
	<author name="daniele" />
	<end/> 
	
</templet>
    文档约束规则:
       1)bean元素可以有0或无限多个,它只能包含property子元素,并且有一个必选的class属性和一个可选的name属性;
       2)property元素可以有0或无限多个,不能包含任何的子元素和文本内容,它只能是bean元素的子元素,并且有一个必选的name属性,以及两个可选的type和ref属性;
       3)description元素只能有一个为date类型的属性,它只能包含文本内容,并且只能出现在bean元素的后面;
       4)end元素无任何属性、子元素和文本内容,只起到结束标记,并且只能出现在description元素的后面。
       由于在templet_test.xml文件的根元素<templet>中没有引入相关的约束文档。因此,针对上述的约束规则在此文档中就是无效的。因此,下一步我们需要创建一个以".xsd"为后缀名的约束文档(schame_test.xsd),然后再将此文档引入到xml文件中。
2.设计Schema约束文档              
        Schema提供了一系列的组件供用户来设计相关的Schema约束规范。附件为常用标签说明,更多详情请参考http://www.w3school.com.cn/schema/schema_elements_ref.asp
<?xml version="1.0" encoding="UTF-8"?>

<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema" 
	xmlns:tns="http://www.appdemo.daniele.com/schema/templet" 
	targetNamespace="http://www.appdemo.daniele.com/schema/templet">
	
	<!-- 定义XML根元素temple,其内有0个或多个bean元素 -->
	<xsd:element name="templet">
		<!-- 
			complexType元素表示templet是一个复合类型,
			属性为false,表示它只能包含元素。
			否则,为true(默认)表示同时还可包含文本。
		-->
		<xsd:complexType mixed="false">
			
			<!-- 
				定义子元素组必须按照其sequence内部定义时的顺序出现一次(默认为有且只出现一次) 
				次数可通过minOccurs和maxOccurs这两个属性来控制。
			-->
			<xsd:sequence>
				<!-- 
					通过ref属性值,引用其他元素作为当前元素的子元素。
					如果在schema中定义了目标名称空间,则ref值为"名称空间前缀:子元素名",
					否则直接关联子元素名(对应另一个element元素的name属性值)即可。
				 -->
				<xsd:element ref="tns:bean" minOccurs="0" maxOccurs="unbounded"/>
				<xsd:element ref="tns:description" minOccurs="0" maxOccurs="1"/>
				<xsd:element ref="tns:author" minOccurs="0" maxOccurs="1"/>
				<xsd:element ref="tns:end" minOccurs="0" maxOccurs="1"/>
			</xsd:sequence>
		</xsd:complexType>
	</xsd:element>
	
	<xsd:element name="bean">
		<xsd:complexType>
			<!-- 按顺序出现0次(minOccurs="0")或多次(maxOccurs="unbounded")其内部引用的元素 -->
			<xsd:sequence minOccurs="0" maxOccurs="unbounded">
				<xsd:element ref="tns:property" />
			</xsd:sequence>
			<!-- 
				定义当前元素具备的属性。
					1)name:属性名
					2)type:属性值类型
					3)use:可选性。
					      required:必须,optional:可选(默认),prohibited:禁用
					                当为可选时,可以不用设置该属性。
			-->
			<xsd:attribute name="class" type="xsd:string" use="required" />
			<xsd:attribute name="name" type="xsd:string" />
		</xsd:complexType>
	</xsd:element> 
	
	<xsd:element name="property">
		<xsd:complexType mixed="false">
			<xsd:attribute name="name" type="xsd:string" use="required" />
			<!-- 
				如果某个属性值具有备选值,则利用<xsd:simpleType>
				和<xsd:restriction>这两个元素来替代type属性
			-->
			<xsd:attribute name="type" default="java:string">
				<!-- 表示当前属性的值为简单类型 -->
				<xsd:simpleType>
					<!--表示当前属性备选值限定的类型 -->
					<xsd:restriction base="xsd:string">
						<!-- 备选值定义 -->
						<xsd:enumeration value="java:boolean" />
						<xsd:enumeration value="java:byte " />
						<xsd:enumeration value="java:char" />
						<xsd:enumeration value="java:double" />
						<xsd:enumeration value="java:float" />
						<xsd:enumeration value="java:long" />
						<xsd:enumeration value="java:integer" />
						<xsd:enumeration value="java:short" />
						<xsd:enumeration value="java:string" />
					</xsd:restriction>
				</xsd:simpleType>
			</xsd:attribute>
			<xsd:attribute name="ref" type="xsd:string" />
		</xsd:complexType>
	</xsd:element>
	
	<!-- description元素只包含文本和属性date -->
	<xsd:element name="description">
		<xsd:complexType>
			<xsd:simpleContent>
				<!-- 文本类型为任意字符 -->
				<xsd:extension base="xsd:string">
					<!-- 
						定义description元素的可选的date属性,其值必须符合日期时间类型 
						如果不在extension中定义任何attribute,则表示当前元素只能包含文本内容
					-->
					<xsd:attribute name="date" type="xsd:date"/>
				</xsd:extension>
			</xsd:simpleContent>
		</xsd:complexType>
	</xsd:element>
	
	<!-- 定义只有一个必选name属性的author元素,不能有子元素和文本内容 -->
	<xsd:element name="author">
		<xsd:complexType mixed="true">
			<xsd:attribute name="name" use="required"/>
		</xsd:complexType>
	</xsd:element>
	
	<!-- 定义为空的end元素,即不能任何有子元素、文本内容和属性 -->
	<xsd:element name="end">
		<xsd:complexType />
	</xsd:element>
	
</xsd:schema>
       在.xsd约束文档中,都是以<schema>来作为根元素的。其中,有两个关键属性需要在设计时设置。
       1)xmlns:规定在此 schema 中使用的一个或多个命名空间的 URI 引用。为避免冲突,可为它分配一个前缀,例如xmlns:xsd="http://www.w3.org/2001/XMLSchema"。一旦分配了前缀,则在引入schema组件定义约束时,需在这些组件的标签中加上前缀,例如<xsd:element></xsd:element>。
       2)targetNamespace:schema命名空间的URI引用。一般指定为Schema文件所在目录位置的URI即可,例如:http://www.springframework.org/schema/aop。一旦定义了命名空间,则XML实例文件就必须通过命名空间的方式引入它;如果没有定义命名空间,则XML实例文件就只能用无命名空间的方式引入它。
       3)xmlns:tns:目标命名空间,不是必须的。当进行Schema组件和类型关联引用时需要用到。
       另外还有一些可选属性在设计时可能会使用到。
       1)elementFormDefault
       默认值为 "unqualified"。当为默认值无此属性时,则表示在XML文件中使用schema组件时,其标签名称无需加上前缀来进行限定。而属性值为"qualified"时,则需要加上前缀。
       2)attributeFormDefault
       默认值为 "unqualified"。当为默认值无此属性时,则表示在XML文件中使用schema组件时,其属性名称无需加上前缀来进行限定。而属性值为"qualified"时,则需要加上前缀。
       3)version
       规定 schema 的版本。
3.引入Schema约束文档
       当约束文档设计无误后,就可以按照如下两种方式之一,将相关约束引入到我们的XML实例文档中:
       1)名称空间引入
       通过这种方式,需要在我们的XML文档根元素中增加如下两个关键属性来实现:
       xmlns命名空间,该属性值应与约束文档中targetNamespace属性值保持一致;
       xsi:schemaLocation:约束文档所在的路径。取值为“命名空间 文档名”,注意命名空间与文档名之间应保持有一个空格或换行符。
       2)无名称空间引入
       这种方式只能引入没有目标命名空间的约束文档(即被引用的约束文档中没有定义targetNamespace属性)。通过如下关键的属性来实现:
       xsi:noNamespaceSchemaLocation:即约束文档相对于当前XML实例文档的路径。因此,这种方式只适用于本地引入的需求。
       如上两种方式都还需要一个关键属性来支持,即xmlns:xsi,这是Schema解析器所需要的,其值通常为“http://www.w3.org/2001/XMLSchema-instance”,表示遵循W3C的Schema约束规范。
       引入约束后的XML文档(templet_test.xml)的内容如下:
<?xml version="1.0" encoding="UTF-8"?>

<!-- 无命名空间引入 -->
<!-- <templet xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
		 xsi:noNamespaceSchemaLocation="schame_test.xsd"> -->

<!-- 命名空间引入 -->
<templet xmlns="http://www.appdemo.daniele.com/schema/templet"
		 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
		 xsi:schemaLocation="http://www.appdemo.daniele.com/schema/templet schame_test.xsd">

	<bean name="user" class="com.daniele.appdemo.test.domain.User">
		<property name="id" type="java:long"/>
		<property name="name" type="java:string" />
		<property name="age" type="java:integer"/>
		<property name="mail" type="java:string" />
		<property name="company" ref="company" />
	</bean>
	
	<bean name="company" class="com.daniele.appdemo.test.domain.Company"></bean>
	
	<description date="2013-06-07">This is a XML Schema example.</description>
	<author name="daniele" />
	<end/> 
	
</templet>
       在Eclipse环境中,当我们键入"Alt + /"的组合键后,将会在弹出的提示框中显示备选的元素和属性等。
分享到:
评论

相关推荐

    根据xml schema生成xml

    XML Schema(通常缩写为XSD)则是为XML文档定义结构和数据类型的规范,它允许我们对XML文档进行更严格的约束,确保数据的一致性和准确性。这篇博客文章“根据XML Schema生成XML”探讨了如何使用XML Schema来创建符合...

    XML文件XML Schema.docXML Schema.doc

    "XML Schema知识点" XML Schema是XML语言为基础的,它用于可替代DTD。它用于描述XML文档的结构。XML Schema语言也被...XML Schema是XML文档的结构描述语言,它具有强大的功能和可扩展性,是XML文档的标准描述语言。

    xml约束[dtd,Schema].zip

    为了确保XML文档的结构正确性与一致性,XML约束技术应运而生,主要有两种形式:DTD(Document Type Definition)和XML Schema。 **DTD(Document Type Definition)** DTD是XML的早期约束和验证机制,它定义了XML...

    XML与WEB Service技术(微软):实验五 在XML文档中使用Schema .doc

    同时,本实验也可以帮助学生更好地理解XML文档的结构和约束,并掌握如何使用XML Schema来描述和验证XML文档。 知识点: 1. XML Schema的定义和应用 XML Schema是一种基于XML的模式语言,用于定义XML文档的结构和...

    XSD根据xml生成schema文件

    本篇文章将深入探讨如何根据XML文件生成对应的XSD schema文件,以便更好地管理和验证XML文档。 首先,我们需要理解XSD的作用。XSD文件定义了一系列规则,这些规则描述了XML文档应该包含哪些元素、属性,以及它们...

    通过Schema验证XML格式是否正确

    5. **XmlSchema类**:该类用于加载和处理XML Schema文件,可以创建一个XmlSchema对象来读取XSD文件,并构建出XML文档必须遵循的结构模型。 6. **XmlDocument类**:此类代表XML文档,提供加载XML数据、验证文档以及...

    理解XML Schema XML Schema进阶

    XML Schema是目前国际标准的XML建模工具,本文将对XML Schema进行详细的介绍,帮助读者初步掌握XML Schema的使用方法和XML Schema文档实例的具体语义。 1. 命名空间的使用 XML Schema中命名空间的使用是非常重要的...

    XML、DTD、Schema

    XML Schema使用XML语法来定义XML文档的结构和数据类型,这意味着它能够表达更复杂的约束,如数据类型限制、命名空间支持和默认值设定。例如,一个XML Schema声明可能如下: ```xml &lt;xs:schema xmlns:xs=...

    XML详解----Schema(精讲)

    XML Schema是XML文档的约束机制,用于定义XML文档的结构和内容。它是XML 1.0规范的一部分,提供了一个强大的工具来描述和验证XML文档。 XML Schema的优点是: * 强大的描述能力:XML Schema可以定义复杂的数据类型...

    Schema教程 xml

    - 引用Schema:在XML文档中通过`&lt;xs:schema&gt;`引用Schema文件。 - 验证文档:使用XML解析器或工具检查XML文档是否符合Schema定义。 5. XML Schema与DTD的对比 - 功能:XML Schema提供了更丰富的数据类型和约束,而...

    西工大服务计算实验2-1_XML Schema

    通过这些库,你可以加载XML Schema文件,验证XML文档是否符合Schema定义,也可以根据Schema生成XML文档。 标签"SOA"提示我们,这个实验可能与Service-Oriented Architecture(面向服务架构)有关。在SOA中,XML和...

    XML DTD,XmlSchema标准参考手册

    XML DTD(Document Type Definition)和XML Schema是两种主要的XML语义约束机制,用于定义XML文档的结构和数据类型。 XML DTD是最早的XML文档类型定义方式,它使用一套预定义的元素和属性来描述XML文档的结构。DTD...

    xmlschema实验及答案.doc

    3. 可重用性:XML Schema文件可以在多个XML文档中重用,减少了开发和维护的成本。 4. 验证性:XML Schema提供了一个强大的工具来验证XML文档的结构和内容,确保了数据的正确性和一致性。 XML Schema的应用 1. 数据...

    XML Schema xsd XML Schema xsd

    2. 在 XML 文档中引用 Schema 文件,通过 `xmlns:xsi` 命名空间和 `xsi:schemaLocation` 属性实现。 3. 验证 XML 文档:XML 解析器或验证工具会根据 Schema 对文档进行验证,发现并报告任何不符合 Schema 规则的问题...

    XML Schema 的简介

    XML Schema 简介 XML Schema 是一种基于 XML 的 DTD 替代者,它可以描述 XML ...XML Schema 是一种强大的工具,用于定义和描述 XML 文档的结构和约束。它具有很多优点,包括支持数据类型、可扩展性和保护数据通信等。

    apache xmlschema api文档

    通过调用其`validate()`方法,可以检查XML文档是否满足Schema的约束。 使用Apache XML Schema API,开发者可以实现以下功能: - 验证XML文档:创建`Validator`对象,然后使用它来验证XML文档是否符合XML Schema。 -...

    XML基础实例 Schema

    5. **约束和验证**:Schema提供了一种强大的方式来约束XML文档的结构,包括元素的数量、顺序、出现次数、数据类型等。这有助于确保XML数据的准确性和一致性。在处理XML数据时,可以使用Schema进行验证,以检查文档...

    XmlSchema-1.4.6.jar

    XML Schema,简称XSD,是一种用于定义XML文档结构和数据类型的规范。`XmlSchema-1.4.6.jar` 是一个包含Java绑定的XML Schema API的库,它为处理XML Schema文档提供了支持。在开发Web服务客户端时,尤其是与基于SOAP...

    XML的schema部分代码

    2. **元素和属性的约束**:XML Schema允许我们定义元素和属性的存在性、顺序、重复次数以及它们的值域,从而控制XML文档的结构。例如,可以指定某个元素是必需的还是可选的,或者限制其内容只能是特定的值。 3. **...

Global site tag (gtag.js) - Google Analytics