schema约束文档与xml文件详解

  • 1.前言
  • 2.schema约束文档(.xsd文件)
    • 2.1 targetNameSpace
    • 2.2官方文档与自定义文档的关系
    • 2.3 声明名称空间
    • 2.4 schema文档中的全局成分与非全局成分
    • 2.5 完整的自定义schema文档
  • 3.xml文件
    • 3.1 声明名称空间
    • 3.2 xml中名称空间使用的范畴
    • 3.3 schemaLocation
    • 3.4 noNamespaceSchemaLocation
    • 3.5 官方schema,自定义schema,xml之间的关系
  • 4.感谢

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

schema约束文档与xml文件详解相关推荐

  1. DOM4J解析XML文档、Document对象、节点对象节点对象属性、将文档写入XML文件(详细)...

    Dom4j是一个简单.灵活的开放源代码的库.Dom4j是由早期开发JDOM开发的.与JDOM不同的是,dom4j使用接口和抽象的人分离出来而后独立基类,虽然Dom4j的API相对要复杂一些,但它提供了 ...

  2. [转]AndroidManifest.xml文件详解

    转自:http://www.cnblogs.com/greatverve/archive/2012/05/08/AndroidManifest-xml.html AndroidManifest.xml ...

  3. Libvirt XML文件详解(一)

    Libvirt XML文件详解(一) 1 根元素 2 通用元数据( General metadata ) name uuid genid title description metadata 2 操作 ...

  4. Maven的pom.xml文件详解------Environment Settings

    转载自  Maven的pom.xml文件详解------Environment Settings Issue Management 使用的缺陷跟踪系统(Bugzilla,TestTrack,Clear ...

  5. mybatis 鉴别其_MyBatis之Mapper XML 文件详解(四)-JDBC 类型和嵌套查询

    MyBatis之Mapper XML 文件详解(四)-JDBC 类型和嵌套查询 白玉 IT哈哈 支持的 JDBC 类型 为了未来的参考,MyBatis 通过包含的 jdbcType 枚举型,支持下面的 ...

  6. javaweb web.xml文件详解

    web.xml文件详解 前言:一般的web工程中都会用到web.xml,web.xml主要用来配置,可以方便的开发web工程.web.xml主要用来配置Filter.Listener.Servlet等 ...

  7. tensorflow 读取cifar_对tensorflow中cifar-10文档的Read操作详解

    前言 在tensorflow的官方文档中得卷积神经网络一章,有一个使用cifar-10图片数据集的实验,搭建卷积神经网络倒不难,但是那个cifar10_input文件着实让我费了一番心思.配合着官方文 ...

  8. Maven的pom.xml文件详解------The Basics

    转载自  Maven的pom.xml文件详解------The Basics Maven坐标 GroupId.artifactId和version构成了Maven的坐标(groupId和version ...

  9. Maven的pom.xml文件详解------Build Settings

    转载自  Maven的pom.xml文件详解------Build Settings 根据POM 4.0.0 XSD,build元素概念性的划分为两个部分:BaseBuild(包含poject bui ...

最新文章

  1. KubeShere安装Redis
  2. poj 2513(欧拉路径+字典树映射)
  3. Assert(断言) 的用法
  4. 有关linux下redis overcommit_memory的问题,以及导致的:Cannot allocate memory问题
  5. 分析redis中大key的几种办法
  6. python分支条件语句格式_Python基础-06 if语句——分支结构(选择结构)
  7. 部署Dotnet Core应用到Kubernetes(二)
  8. jmeter学习笔记(一)
  9. 2017下半年网络规划设计师考试下午真题
  10. (41)VHDL实现移位寄存器(方法3)
  11. 固定于计算机主机,一种便于固定的计算机主机的制作方法
  12. php 星号邮箱,PHP以星号隐藏用户名手机号码和邮箱实例
  13. Confluence 附件(Attachments)宏
  14. 最小生成树详解(模板 + 例题)
  15. 打开QQ音乐检测不到声卡
  16. 原创教程:下载和安装Python3.9
  17. 优秀课程案例:使用Scratch制作飞机大战游戏!
  18. 如何在word中像LaTex那样打公式
  19. ardupilot固件移植
  20. 3、核对单《数据收集工具与技术》

热门文章

  1. Python爬虫基本库的使用
  2. 总线制和多线制示意图_再谈总线制与多线制的区别
  3. Linux上(Redhat7)实现NFS文件共享服务
  4. Java 枚举7常见种用法
  5. linux 误删除mysql表能恢复吗,Linux中误删除数据文件和归档日志的恢复方法
  6. 运用高斯核模型进行最小二乘回归_比特币价格与时间存在关系?一文读懂比特币价值的对数增长模型...
  7. Linux系统磁状态检测,检测Linux硬件状态
  8. linux系统sql语句报错_在linux下写的mysql无法插入,sql语句在复制中变'脏'了.
  9. mysql 8安装_mysql安装过程详解
  10. oracle实列关闭,Oracle单实例+ASM启动与关闭