`
hougbin
  • 浏览: 491568 次
  • 性别: Icon_minigender_1
  • 来自: 济南
社区版块
存档分类
最新评论

XMLSchema 模式与命名空间

    博客分类:
  • XML
阅读更多

模式与名称空间

DTD的问题就在于和名称空间不相关,当你为一个XML文档使用了名称空间后,文档的DTD就需要重写。XML Schema对名称空间提供了很好的支持。在编写模式文档时,你可以指定该模式文档是为哪一个名称空间声明和定义组件,这个名称空间称为目标名称空间。

4.5.6.1  目标名称空间

目标名称空间使用xs:schema元素的targetNamespace属性来指定,如例4-16所示。

例4-16  book3.xsd

<?xml version="1.0" encoding="UTF-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" 
targetNamespace="http://www.sunxin.org/book"  ①
xmlns:book="http://www.sunxin.org/book">   ②
<xs:element name="book" type="book:bookType"/>  ③

<xs:complexType name="bookType">     ④
<xs:sequence>
<xs:element name="title" type="xs:string"/>
<xs:element name="author" type="xs:string"/>
</xs:sequence>
<xs:attribute name="isbn" type="xs:token"/>
</xs:complexType>
</xs:schema>

① 我们在xs:schema元素上使用targetNamespace属性指定目标名称空间为:http://www.sunxin.org/book,即指明了在该模式文档中声明的元素、定义的类型都属于http://www.sunxin.org/book名称空间。

② 声明名称空间http://www.sunxin.org/book,并为该名称空间绑定前缀book,使用该前缀来引用http://www.sunxin.org/book名称空间中的类型。

③ 由于指定了目标名称空间,文档中定义的类型都属于目标名称空间,因此在引用类型时,需要加上book前缀。

④ 在指定类型名时,不需要加上任何前缀,当使用了targetNamespace属性后,在模式文档中定义的任何类型都属于目标名称空间。

在模式文档中,我们很容易就能区分出不同名称空间中的元素和类型,带有xs前缀的元素和类型属于http://www.w3.org/2001/XMLSchema名称空间,而其他的元素和类型则属于目标名称空间。需要注意的是,只有模式文档中的全局元素和全局属性才属于目标名称空间,在本例中,声明的全局元素name属于目标名称空间,而局部元素title和author则不属于目标名称空间。

为了简化模式文档对目标名称空间中的元素和类型的引用,我们可以利用默认名称空间来简化引用,例4-16如果使用了默认名称空间,可以修改为如例4-17所示。

例4-17  使用了默认名称空间的book4.xsd

<?xml version="1.0" encoding="UTF-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" 
targetNamespace="http://www.sunxin.org/book"
xmlns="http://www.sunxin.org/book">
<xs:element name="book" type="bookType"/>

<xs:complexType name="bookType">
<xs:sequence>
<xs:element name="title" type="xs:string"/>
<xs:element name="author" type="xs:string"/>
</xs:sequence>
<xs:attribute name="isbn" type="xs:token"/>
</xs:complexType>
</xs:schema>

我们在xs:schema元素上声明了默认名称空间http://www.sunxin.org/book,因此在声明book元素时,引用bookType类型就无须再添加前缀了。

符合上述模式文档的XML实例文档如例4-18所示。

例4-18  book.xml

<?xml version="1.0" encoding="GB2312"?>
<book:book xmlns:book="http://www.sunxin.org/book" isbn="978-7-121-06812-6">  
<title>《Struts 2深入详解》</title>
<author>孙鑫</author>
</book:book>

在例4-17的模式文档中,在bookType类型定义中声明的元素title和author是局部元素,没有被目标名称空间所限定,因此在实例文档中,对title和author元素不要添加book前缀。局部元素和属性的限定

在例4-17中,局部元素title和author没有被目标名称空间所限定,如果要限定局部元素和属性,可以通过xs:schema元素的elementFormDefault和attibuteFormDefault属性来设置。

为了指定模式文档中局部声明的元素必须被限定,可以将xs:schema元素的elementFormDefault属性的值设为"qualified"。

将例4-17中的xs:schema元素修改为如例4-19所示。

例4-19  book5.xsd

<?xml version="1.0" encoding="UTF-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" 
targetNamespace="http://www.sunxin.org/book"
xmlns="http://www.sunxin.org/book"
elementFormDefault="qualified">
<xs:element name="book" type="bookType"/>

<xs:complexType name="bookType">
<xs:sequence>
<xs:element name="title" type="xs:string"/>
<xs:element name="author" type="xs:string"/>
</xs:sequence>
<xs:attribute name="isbn" type="xs:token"/>
</xs:complexType>
</xs:schema>

elementFormDefault属性的默认值是unqualified,即对局部声明的元素不加限定。

我们修改了模式文档,相应的就要修改实例文档,如例4-20所示。

例4-20  book2.xml

<?xml version="1.0" encoding="GB2312"?>
<book:book xmlns:book="http://www.sunxin.org/book" isbn="978-7-121-06812-6">
<book:title>《Struts 2深入详解》</book:title>
<book:author>孙鑫</book:author>
</book:book>

在例4-20的实例文档中,所有的元素都属于同一个名称空间,因此我们可以声明一个默认的名称空间,来省略前缀的使用,如例4-21所示。

例4-21  book3.xml

<?xml version="1.0" encoding="GB2312"?>
<book xmlns="http://www.sunxin.org/book" isbn="978-7-121-06812-6">
<title>《Struts 2深入详解》</title>
<author>孙鑫</author>
</book>

属性的限定和元素的限定是类似的。如果属性被声明为全局属性或者xs:schema元素的attibuteFormDefault属性被设置成"qualified"的话,那么属性就必须被限定,在实例文档中将以带名称空间前缀的方式出现。实际上,需要限定的属性必须明确的加上名称空间前缀,因为XML名称空间推荐标准中并没有给出关于属性的默认名称空间的机制,一个没有前缀的属性将不在任何的名称空间中。属性是附属于元素的,对属性添加名称空间不是很有必要,因此在多数应用中都没有给属性添加限定。

使用了attibuteFormDefault属性的模式文档,如例4-22所示。

例4-22  book6.xsd

<?xml version="1.0" encoding="UTF-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" 
xmlns="http://www.sunxin.org/book" 
targetNamespace="http://www.sunxin.org/book" 
elementFormDefault="qualified" 
attributeFormDefault="qualified">
 <xs:element name="book" type="bookType"/>
<xs:complexType name="bookType">
<xs:sequence>
<xs:element name="title" type="xs:string"/>
<xs:element name="author" type="xs:string"/>
</xs:sequence>
<xs:attribute name="isbn" type="xs:token"/>
</xs:complexType>
</xs:schema>

attributeFormDefault属性的默认值是unqualified,即对局部声明的属性不加限定。

一个符合模式(例4-22)的实例文档如例4-23所示。

例4-23  book4.xml

<?xml version="1.0" encoding="GB2312"?>
<book:book xmlns:book="http://www.sunxin.org/book" book:isbn="978-7-121-06812-6">
<book:title>《Struts 2深入详解》</book:title>
<book:author>孙鑫</book:author>
</book:book>

除了使用xs:schema元素的elementFormDefault和attibuteFormDefault属性来限定局部元素和局部属性外,我们还可以在xs:element和xs:attribute元素上分别使用form属性来限定局部元素和局部属性。我们看例4-24。

例4-24  book7.xsd

<?xml version="1.0" encoding="UTF-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" 
xmlns="http://www.sunxin.org/book" 
targetNamespace="http://www.sunxin.org/book">
<xs:element name="book" type="bookType"/>
<xs:complexType name="bookType">
<xs:sequence>
<xs:element name="title" type="xs:string" form="qualified"/>
<xs:element name="author" type="xs:string" form="qualified"/>
</xs:sequence>
<xs:attribute name="isbn" type="xs:token" form="qualified"/>
</xs:complexType>
</xs:schema>

例4-24所示的模式文档和例4-22所示的模式文档的效果是一样的。 

要注意的是,在xs:schema元素上使用elementFormDefault和attibuteFormDefault属性,影响的是整个模式文档中的局部元素和局部属性,而在xs:element和xs:attribute元素上使用form属性,影响的是当前的局部元素和局部属性。

未声明的目标名称空间

对于很多不使用名称空间的XML文档,你需要使用没有声明目标名称空间的模式文档。我们看例4-25。

例4-25  book8.xsd

<?xml version="1.0" encoding="UTF-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
<xs:element name="book" type="bookType"/>
<xs:complexType name="bookType">
<xs:sequence>
<xs:element name="title" type="xs:string"/>
<xs:element name="author" type="xs:string"/>
</xs:sequence>
<xs:attribute name="isbn" type="xs:token"/>
</xs:complexType>
</xs:schema>

在这个模式文档中我们没有声明目标名称空间,因此定义的bookType类型和声明的book元素都是没有名称空间限定的。在引用类型或元素时,不需要添加任何的名称空间前缀。在本例中,声明book元素时,type属性直接引用了bookType类型。与之相对的是,例4-25的模式文档中使用的所有XML Schema元素和类型都是通过与XML Schema名称空间相关联的名称空间前缀"xs"来明确进行限定的。

一个符合模式(例4-25)的实例文档如例4-26所示。

例4-26  book5.xml

<?xml version="1.0" encoding="GB2312"?>
<book isbn="978-7-121-06812-6">
<title>《Struts 2深入详解》</title>
<author>孙鑫</author>
</book>

要注意的是,在没有声明目标名称空间的模式文档中,强烈建议对所有的XML Schema元素和类型使用一个和XML Schema名称空间相关联的名称空间前缀(如xs或xsd)来明确实施限定。如果你对XML Schema的元素和类型使用了默认名称空间,那么对XML Schema类型的引用也许不能和对用户自定义类型的引用相区分,从而导致模式文档出现错误。例4-27错误的使用了默认名称空间,使得对自定义类型的引用和对XML Schema类型的引用不能区分。

例4-27  book9.xsd

<?xml version="1.0" encoding="UTF-8"?>
<schema xmlns="http://www.w3.org/2001/XMLSchema">
<element name="book" type="bookType"/>
<complexType name="bookType">
<sequence>
<element name="title" type="string"/>
<element name="author" type="string"/>
</sequence>
<attribute name="isbn" type="token"/>
</complexType>
</schema>

在XMLSpy中验证这个模式文档时,将提示如下的错误信息:

'bookType' must refer to an existing simple or complex type.

这是因为模式验证器认为对bookType类型的引用(没有前缀的引用),引用的是默认名称空间(即http://www.w3.org/2001/XMLSchema名称空间)中的类型,而XML Schema名称空间中并没有bookType这种类型,因此就报出了错误。

分享到:
评论

相关推荐

    《XML》实验任务书 XML Schema 答案 解答

    假设SpyBase1.xml中的alias、mission、spy来自不同的命名空间中,如何在Schema中对其进行限定,请在XMLSPY中完成相应的xsd文档?修改SpyBase1.xml,并验证新的SpyBase1_2.xsd是否正确? [提交时间及内容] 最后...

    XSDInferencer:XSDInferencer 是一个自动 XML Schema 文档生成工具,它可以从 XML 正例中生成全面且正确的 XSD

    XSDInferencer 的主要优点: 100% 符合 XML 和 XSD 规范,包括正确的命名空间处理。 高度可配置,因此生成的模式更适合用户需求。 模块化且易于扩展。 它不仅可以根据节点名称,还可以根据它们的上下文来推断简单和...

    C# XML入门经典

    主要内容包括:XML语法和格式良好的XML,XML命名空间,利用DTD和XML Schema进行XML验证,使用SOAP和Web服务,以及运用ADO.NET进行数据库访问等。本书还用两个案例分析来展示XML的具体应用。  本书适合于有一定的...

    从XML模式文件生成C#类-.NET开发

    通过显式或通过(confi XmlSchemaClassGenerator一个控制台程序和库,将XML命名空间映射到C#名称空间。从XML Schema文件生成XmlSerializer兼容的C#类的控制台程序和库。来自架构注释的C#XML注释根据架构限制生成...

    C#XML入门经典 C#编程人员必备的XML技能.part2

    XML模式——背景知识、语言和一般用法 &lt;br&gt;10.1 XML模式(XSD)的任务 10.2 格式良好且有效的XML模式 10.3 什么是模式 10.4 XML模式定义语言 10.4.1 XSD中的元素 10.4.2 定义属性 10.5 XML模式...

    XQuery权威指南(简码·扫描版)

    第10章 命名空间与XQuery  10.1 命名空间  10.2 命名空间和XQuery  10.3 查询中的命名空间声明  10.4 在结果中控制命名空间声明 第11章 深入了解类型  11.1 XQuery类型系统  11.2 内置类型  11.3 类型、节点...

    .net读写xml文档详解

    一 .Net框架中与XML有关的命名空间 System.Xml包含了一些和XML文档的读写操作相关的类,它们分别是:XmlReader、XmlTextReader、XmlValidatingReader、XmlNodeReader、XmlWriter、XmlTextWriter 以及 XmlNode(它的...

    从Java走向Java+EE+.rar

    4.1.3 XML命名空间 31 4.2 XML能用来干什么 32 4.3 用DTD验证XML文档 33 4.4 用Schema验证XML文档 35 4.4.1 使用XML Schema 35 4.4.2 Schema的语法 37 4.5 用JAXP读写XML 44 4.6 Java EE中的JAXB 55...

    Java核心技术II(第8版)

    9.1.2 将类加载器作为命名空间 9.1.3 编写你自己的类加载器 9.2 字节码校验 9.3 安全管理器与访问权限 9.3.1 Java 平台安全性 9.3.2 安全策略文件 9.3.3 定制权限 9.3.4 实现权限类 9.4 用户认证 9.4.1 JAAS 登录...

    jdublin-core

    jdublin核心 简单的DC XML Schema Java端口。... 该模式定义了简单都柏林核心的术语,即命名空间中的15个元素,不使用编码方案或元素改进。 所有元素的默认内容类型是xs:string并且具有xml:lang属性。

    zuul-spring-client:用于Zuul集成的Spring框架客户端

    从zuul-spring-client的v 1.4开始,已对命名空间进行了重构,以允许PGP和PBE密钥配置。 仍然可以使用,但不支持PGP。 Maven依赖 &lt; groupId&gt;org.devnull &lt; artifactId&gt;zuul-spring-client &lt; version&gt;1.5.1 简单用法...

    Java语言基础下载

    默认的命名空间 372 使用命名空间 373 XML 文档规则 374 XML Schema 379 Schema和DTD的区别: 380 Schema的数据类型 380 样式表(XSL) 384 CSS样式表 384 XSL样式表 385 XSL的基本结构 386 XSL的基本语法 390 节点...

    asp.net知识库

    XSLT与XML转换的详细介绍 功能应用 读写搜索 基础教程 RSS Web2.0时代,RSS你会用了吗?(技术实现总结) 知识集锦:三分钟全面了解 Blog 和 RSS C#+ASP.NET开发基于Web的RSS阅读器 ASP.NET RSS Toolkit(RSS工具) ...

    Spring中文帮助文档

    6.3. 基于Schema的AOP支持 6.3.1. 声明一个切面 6.3.2. 声明一个切入点 6.3.3. 声明通知 6.3.4. 引入 6.3.5. 切面实例化模型 6.3.6. Advisor 6.3.7. 例子 6.4. AOP声明风格的选择 6.4.1. Spring AOP还是...

    C#微软培训资料

    2.2 公用语言运行时环境与公用语言规范.13 2.3 开 发 工 具 .17 2.4 小 结 .19 第三章 编写第一个应用程序 .20 3.1 Welcome 程序 .20 3.2 代 码 分 析 .20 3.3 运 行 程 序 .23 .4 添 加 注 释 .25 ...

    Spring API

    6.3. 基于Schema的AOP支持 6.3.1. 声明一个切面 6.3.2. 声明一个切入点 6.3.3. 声明通知 6.3.4. 引入 6.3.5. 切面实例化模型 6.3.6. Advisor 6.3.7. 例子 6.4. AOP声明风格的选择 6.4.1. Spring AOP还是...

    超级有影响力霸气的Java面试题大全文档

    为了提高效率节省空间,我们应该用StringBuffer类 6、int 和 Integer 有什么区别  Java 提供两种不同的类型:引用类型和原始类型(或内置类型)。Int是java的原始数据类型,Integer是java为int提供的封装类。Java...

    java 面试题 总结

    为了提高效率节省空间,我们应该用StringBuffer类 3、int 和 Integer 有什么区别 Java 提供两种不同的类型:引用类型和原始类型(或内置类型)。Int是java的原始数据类型,Integer是java为int提供的封装类。Java为每...

Global site tag (gtag.js) - Google Analytics