xml模式文档(xml:Schema)详解

2023-11-06

XML Schema 是基于 XML 的 DTD 替代者。

XML Schema 描述 XML 文档的结构。

XML Schema 语言也称作 XML Schema 定义(XML Schema Definition,XSD)。

下面的例子是一个XML Schema文件,名为"note.xsd"

[html]  view plain copy
  1. <?xml version="1.0"?>  
  2. <xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema"  
  3. targetNamespace="http://www.w3schools.com"  
  4. xmlns="http://www.w3schools.com"  
  5. elementFormDefault="qualified">  
  6. <xsd:element name="note">  
  7.       <xsd:complexType>  
  8.          <xsd:sequence>  
  9.            <xsd:element name="to" type="xsd:string"/>  
  10.            <xsd:element name="from" type="xsd:string"/>  
  11.            <xsd:element name="heading" type="xsd:string"/>  
  12.            <xsd:element name="body" type="xsd:string"/>  
  13.         </xsd:sequence>  
  14.       </xsd:complexType>  
  15. </xsd:element>  
  16. </xsd:schema>  

  17. 下面的XML文档和上文给出的XML Schema相关联,名为"note.xml"。并且下文的讨论将围绕这两个文档展开。

    [html]  view plain copy
    1. <?xml version="1.0"?>  
    2. <note xmlns="http://www.w3schools.com"  
    3. xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"  
    4. xsi:schemaLocation="http://www.w3schools.com note.xsd">  
    5. <to>Tove</to>  
    6. <from>Jani</from>  
    7. <heading>Reminder</heading>  
    8. <body>Don't forget me this weekend!</body>  
    9. </note>  
    note.xsd中,此片段:xmlns:xsd="http://www.w3.org/2001/XMLSchema",表明此schema中使用的元素和数据类型来自于"http://www.w3.org/2001/XMLSchema"名称空间(namespace)。它同样指出来自于"http://www.w3.org/2001/XMLSchema"名称空间的元素和数据类型必须使用带"xsd: "前缀。作为名称空间的标识符(在声明中作为元素或属性的前缀),你也可以不使用xsd或xsi。这个 xmlns属性包含了基本的XML schema元素,比如element, attribute, complexType, group, simpleType等。
         对于任何一个XML Schema定义文档(XSD)都有一个最顶层的schema (XSD)元素。而且该schema (XSD)元素定义必须包含这个名称空间:http://www.w3.org/2001/XMLSchema。即此名称空间是由XML模式规范定义的标准名称空间-所有XML模式元素必须属于该名称空间。

  18. 此片段:targetNamespace="http://www.w3schools.com",表明此schema (note, to, from, heading, body)定义的元素来自于"http://www.w3schools.com"名称空间。这个targetNamespace属性表示了该schema所对应的名称空间的URI。也就是说在引用该Schema的其它文档(包括自身文档)中要声明名称空间,其URI应该是targetNamespace的属性值。例如在这里因为要用到note.xsd自己定义的扩展数据类型(note, to, from, heading, body),所以也声明了名称空间xmlns="http://www.w3schools.com"。而且该名称空间是默认名称空间(没有前缀)。targetNamespace属性为在模式中显式创建的所有新类型均声明了XML名称空间。

重点理解Schema文档使用自身定义类型

     xsd文件中定义了一个targetNameSpace后,其内部定义的元素,属性,类型等都属于该targetNameSpace,其自身或外部xsd文件使用这些元素,属性等都必须从定义的targetNameSpace中找。修改一下note.xsd,去除默认名称空间的声明,并添加一个复杂类型:

[html]  view plain copy
  1. <?xml version="1.0"?>  
  2. <xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema"  
  3. targetNamespace="http://www.w3schools.com"  
  4. elementFormDefault="qualified">  
  5. <xsd:element name="note">  
  6.       <xsd:complexType>  
  7.         <xsd:sequence>  
  8.        <xsd:element name="to" type="xs:string"/>  
  9.        <xsd:element name="from" type="xs:string"/>  
  10. <xsd:element name="heading" type="xs:string"/>  
  11.        <xsd:element name="body" type="xs:string"/>  
  12.        </xsd:sequence>  
  13.       </xsd:complexType>  
  14. </xsd:element>  
  15. <xsd:element name="Student" type="stu"/>   
  16.   <xsd:complexType name="stu">   
  17.   <xsd:sequence>   
  18.    <xsd:element name="Name" type="xs:string"/>   
  19.    <xsd:element name="Class" type="xs:string"/>   
  20.   </xsd:sequence>   
  21.  </xsd:complexType>   
  22. </xsd:schema>  

        上述代码中,复杂类型stu是找不到的,因为你定义了一个名称空间" http://www.w3schools.com",该复杂类型存在于"http://www.w3schools.com"中,因此应该修改代码如下:

[html]  view plain copy
  1. <?xml version="1.0"?>  
  2. <xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema"  
  3. targetNamespace="http://www.w3schools.com"  
  4. xmlns:student="http://www.w3schools.com"  
  5. elementFormDefault="qualified">  
  6. <xsd:element name="note">  
  7.       <xsd:complexType>  
  8.         <xsd:sequence>  
  9.        <xsd:element name="to" type="xs:string"/>  
  10.        <xsd:element name="from" type="xs:string"/>  
  11. <xsd:element name="heading" type="xs:string"/>  
  12.        <xsd:element name="body" type="xs:string"/>  
  13.        </xsd:sequence>  
  14.       </xsd:complexType>  
  15. </xsd:element>  
  16. <xsd:element name="Student" type="student:stu"/>   
  17.   <xsd:complexType name="stu">   
  18.   <xsd:sequence>   
  19.    <xsd:element name="Name" type="xs:string"/>   
  20.    <xsd:element name="Class" type="xs:string"/>   
  21.   </xsd:sequence>   
  22.  </xsd:complexType>   
  23. </xsd:schema>  

        若自身并不使用重用组件,仅供外部使用的话,则只定义targetNameSpace就可以,不用指定别名。
        通过上面的例子,我们可以很深刻的理解targetNameSpace。targetNamespace定义了Schema定义的新元素与属性的名称空间。而"http://www.w3.org/2001/XMLSchema"名称空间则定义了element, attribute, complexType, group, simpleType等元素。



xsi:schemaLocation详解

在实例中引用模式文档

XML Schema提供了两个在实例文档中使用的特殊属性,用于指出模式文档的位置。这两个属性是:xsi:schemaLocation和xsi:noNamespaceSchemaLocation,前者用于声明了目标名称空间的模式文档,后者用于没有目标名称空间的模式文档,它们通常在实例文档中使用。

4.5.7.1  xsi:schemaLocation属性

xsi:schemaLocation属性的值由一个URI引用对组成,两个URI之间以空白符分隔。第一个URI是名称空间的名字,第二个URI给出模式文档的位置,模式处理器将从这个位置读取模式文档,该模式文档的目标名称空间必须与第一个URI相匹配。我们看例4-28。

例4-28  book6.xml

 

<?xml version="1.0" encoding="GB2312"?>
<book xmlns="http://www.sunxin.org/book"   ①
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"  ②
xsi:schemaLocation="http://www.sunxin.org/book http://www.sunxin.org/ 
book.xsd">  ③
<title>《Struts 2深入详解》</title>
<author>孙鑫</author>
</book>

① 声明默认的名称空间(http://www.sunxin.org/book)。

② 声明XML Schema实例名称空间(http://www.w3.org/2001/XMLSchema-instance),并将xsi前缀与该名称空间绑定,这样模式处理器就可以识别xsi:schemaLocation属性。XML Schema实例名称空间的前缀通常使用xsi。

③ 使用xsi:schemaLocation属性指定名称空间http://www.sunxin.org/book和模式位置http://www.sunxin.org/book.xsd相关要注意,在这个例子中,book.xsd中声明的目标名称空间要求是http://www.sunxin.org/book

一个可能的模式文档book.xsd如例4-29所示。

例4-29  book.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">

<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:complexType>
</xs:schema>

实际上,xsi:schemaLocation属性的值也可以由多个URI引用对组成,每个URI引用对之间使用空白符分隔。例4-30的实例文档使用了多个名称空间,xsi:schemaLocation属性的值包含了两对URI。

例4-30  books.xml

 

<?xml version="1.0" encoding="GB2312"?>
<books xmlns="http://www.sunxin.org/bks" xmlns:p="http://www.sunxin.org/people"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.sunxin.org/bks bks.xsd
http://www.sunxin.org/people people.xsd">
<book>
<title>JSP深入编程</title>
<author>
<p:name>张三</p:name>
<p:title>作家</p:title>
</author>
</book>
<book>
<title>XML从入门到精通</title>
<author>
<p:name>李四</p:name>
<p:title>教师</p:title>
</author>
</book>
</books>

XML Schema推荐标准中指出,xsi:schemaLocation属性可以在实例中的任何元素上使用,而不一定是根元素,不过,xsi:schemaLocation属性必须出现在它要验证的任何元素和属性之前。不过一般我们把它放在根元素上

此外,要注意的是,XML Schema推荐标准并没有要求模式处理器必须要使用xsi:schemaLocation属性,某些模式处理器可以通过其他的方式来得到模式文档的位置,而忽略xsi:schemaLocation属性。

xsi:noNamespaceSchemaLocation属性

xsi:noNamespaceSchemaLocation属性用于引用没有目标名称空间的模式文档。与xsi:schemaLocation属性不同的是,xsi:noNamespaceSchemaLocation属性的值是单一的值,只是用于指定模式文档的位置。例4-31显示了在实例文档中xsi:noNamespaceSchema Location属性的使用。

例4-31  book7.xml

 

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

与xsi:schemaLocation属性一样,xsi:noNamespaceSchemaLocation属性也可以在实例中的任何元素上使用,而不一定是根元素,不过,xsi:noNamespaceSchemaLocation属性必须出现在它要验证的任何元素和属性之前。不过一般情况下放在根元素下

此外,要注意的是,XML Schema推荐标准并没有要求模式处理器必须要使用xsi:noNamespaceSchemaLocation属性,某些模式处理器可以通过其他的方式来得到模式文档的位置,而忽略xsi:noNamespaceSchemaLocation属性

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

xml模式文档(xml:Schema)详解 的相关文章

随机推荐

  • JavaScript math对象

    今天我们来学习JavaScript的math对象 下面跟我来学习一下吧 Math对象和其他对象不同 它不是一个构造函数 它属于一个工具类不用创建对象 它里面封装了数 学运算相关的属性和方法 例如 Math PI 表示圆周率 约等于3 141
  • 匹配11位手机号码的正则表达式

    最近在做一个即时通讯的项目 首先是注册登录界面 项目需求是通过用户输入的手机号码获取一个4位数的验证码来完成注册 那么 问题来了 如何判断用户输入的手机号码是合法的正确的11位手机号码呢 这些简单的问题就在前端判断好了再post给后台 没必
  • 初级测开面试题分享(有文档)

    今天分享一下测试群友发出的面试 小伙伴可以看看自己能答出来几题 当然答案已经整理好了 直接点击文末小卡片就能领取了 同时 我也为大家准备了一份软件测试视频教程 含面试 接口 自动化 性能测试等 就在下方 需要的可以直接去观看 软件测试视频教
  • linux 删除文件

    http blog csdn net taiyang1987912 article details 41488395 http www 360doc com content 16 0325 23 532901 545276975 shtml
  • 3.5 Makefile的重建

    一 Makefile重建是什么 Makefiles是一种用于构建和维护软件项目的工具 它们是文本文件 包含了一系列规则和指令 告诉计算机如何编译 链接和生成可执行文件 当我们使用make命令时 它会检测当前目录下的makefile文件 并根
  • 【Hello Algorithm】二叉树相关算法

    本篇博客介绍 介绍二叉树的相关算法 二叉树相关算法 二叉树结构 遍历二叉树 递归序 二叉树的交集 非递归方式实现二叉树遍历 二叉树的层序遍历 二叉树难题 二叉树的序列化和反序列化 lc431 求二叉树最宽的层 二叉树的后继节点 谷歌面试题
  • 下载 安装npm nodejs yarn详细步骤

    一 安装nodejs 1 下载NodeJs 点击以下链接进入NodeJs官网 https nodejs org zh cn 其他下载 先前已发布版本 找到自己需要的版本 温馨提示 如果之前电脑有安装过Node js的话建议先把之前的文件删干
  • 【大话QT之四】ctkPlugin插件系统实现项目插件式开发

    插件式开发体会 自开始写 大话QT 系列就开始接触渲染客户端的开发 说是开发不如更多的说是维护以及重构 在接手这块的东西之前自己还有点犹豫 因为之前我一直认为客户端嘛 没什么技术含量 总是想做比较有挑战性的 为了这周总还专门找我谈了谈 算是
  • Hive分区分桶的概念与区别

    一 Hive 数据分区 1 Hive 数据分区的概念 在Hive Select查询中一般会扫描整个表内容 会消耗很多时间做没必要的工作 有时候只需要扫描表中关心的一部分数据 因此建表时引入了partition概念 Hive的分区是为了辅助查
  • elasticsearch-修改IK分词器源码来基于mysql热更新词库

    热更新 每次都是在es的扩展词典中 手动添加新词语 很坑 1 每次添加完 都要重启es才能生效 非常麻烦 2 es是分布式的 可能有数百个节点 你不能每次都一个一个节点上面去修改 es不停机 直接我们在外部某个地方添加新的词语 es中立即热
  • C和C++安全编码笔记:并发

    并发是一种系统属性 它是指系统中几个计算同时执行 并可能彼此交互 一个并发程序通常使用顺序线程和 或 进程的一些组合来执行计算 其中每个线程和进程执行可以在逻辑上并行执行的计算 这些进程和 或 线程可以在单处理器系统上使用分时抢占式的方式
  • 解决"taglib definition not consistent with specification version"

    1 问题描述 从tomcat 6 迁移到tomcat 7 时 运行web项目时出现 taglib definition not consistent with specification version 从上面可以看出 这是taglib的定
  • 相似性度量的方法分类

    相似性度量的方法分类 一 变换域 DTW ERP都是不设置阈值 直接计算其欧氏距离 EDR LCSS都是设置一个绝对阈值 满足阈值变成0或者1 CATS 设置一个阈值 不满足阈值取0 满足阈值缩放到 0 1 区间中 Frechet 不设置阈
  • Python 实现弹球游戏

    源代码 from tkinter import 来源于python的标准库 GUI import random import time 创建Ball类 对小球进行定义 class Ball def init self canvas padd
  • Sharding-jdbc实现读写分离、分库分表

    一 简介 Sharding jdbc官网 http shardingsphere apache org 1 概述 a Sharding jdbc是一个开源的分布式的关系型数据库中间件 b Sharding jdbc是客户端代理模式 c 定位
  • MySQL数据库-表索引-隐藏和删除索引

    隐藏索引 MySQL8开始支持隐藏索引 隐藏索引提供了更人性化的数据库操作 隐藏索引 顾名思义 让索引暂时不可见 不会被优化器使用 默认情况下索引时可见的 隐藏索引可以用来测试索引的性能 验证索引的必要性时不需要删除索引 可以先将索引隐藏
  • HbuilderX编译运行uni-app项目时报错:HBuilderX 安装目录不能包括 ( 等特殊字符

    HbuilderX编译运行uni app项目时报错 HBuilderX 安装目录不能包括 等特殊字符 这是因为HBuilderX 被安装在了含有 等特殊的目录中 例如 D Program Files x86 HBuilderX 其中有包含了
  • 数字图像处理matlab实践

    目录 一 任务描述 3 二 设计思路 3 三 功能模块 3 1 图像灰度化 3 2 图像二值化 4 3 图像叠加 5 4 图像目标检测 5 5 图像对数变换 6 6 图像指数变换 7 7 图像直方图均衡化 8 8图像添加噪声 平滑处理 9
  • 单链表详解

    目录 一 什么是链表 1 数据结构概要 2 功能 二 实现链表 1 定义一个具有结点特征的结构体 2 定义一个头指针 3 实现尾插 尾插代码实现如下 4 结点的创建 创建节点代码实现 5 实现尾删 尾删代码实现 6 实现头插 头插代码实现
  • xml模式文档(xml:Schema)详解

    XML Schema 是基于 XML 的 DTD 替代者 XML Schema 描述 XML 文档的结构 XML Schema 语言也称作 XML Schema 定义 XML Schema Definition XSD 下面的例子是一个XM