xml的约束
一、DTD约束xml
1、约束介绍
由于xml的标签由用户自己定义,因此在开发的时候,每个人都可以根据自己的需求来定义xml标签,这样导致项目中的xml难以维护,因此需要使用一定的规范机制来约束xml文件中的标签书写。
2、DTD约束快速入门
第一步:先自己定义一个xml文件
<?xml version="1.0" encoding="UTF-8"?>
<users>
<user>
<name>zhangsan</name>
<age>23</age>
<addr>shanghai</addr>
</user>
<user>
<name>lisi</name>
<age>24</age>
<addr>beijing</addr>
</user>
</users>
第二步:书写DTD文件来约束xml文件
DTD文件在定义的时候,扩展名就是dtd。
在xml文件中有多少个标签,就在dtd中书写多少个ELEMENT标签
<?xml version="1.0" encoding="UTF-8" ?>
<!ELEMENT users (user+) >
<!ELEMENT user (name,age,addr) >
<!ELEMENT name (#PCDATA) >
<!ELEMENT age (#PCDATA)>
<!ELEMENT addr (#PCDATA)>
3、DTD引入方式
DTD主要用来约束xml文件,DTD可以单独写在文件中,也可以直接定义在xml中,可以在xml中引入第三方的公共DTD。 外部DTD的引入方式:外部DTD主要指的一个独立的DTD文件。
首先要书写DTD文件,然后在要被约束的xml文件中引入。
<!DOCTYPE 文档根结点 SYSTEM "DTD文件的URL">
文档根结点 指的是当前xml中的根标签。
SYSTEM 引入的系统中存在文件
"DTD文件的URL" DTD存放的位置 引入公共的DTD:
<!DOCTYPE 文档根结点 PUBLIC "DTD名称" "DTD文件的URL">
文档根结点 指的是当前xml中的根标签。
PUBLIC 表示当前引入的DTD是公共的DTD 在xml中直接书写DTD
<!DOCTYPE 根标签名 [
具体的标签的约束
]>
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE users[
<!ELEMENT users (user+) >
<!ELEMENT user (name,age,addr) >
<!ELEMENT name (#PCDATA) >
<!ELEMENT age (#PCDATA) >
<!ELEMENT addr (#PCDATA) >
]>
<users>
<user>
<name>zhangsan</name>
<age>23</age>
<addr>shanghai</addr>
</user>
<user>
<name>lisi</name>
<age>24</age>
<addr>beijing</addr>
</user>
</users>
4、DTD的语法介绍
元素
当定义DTD约束xml时候,这时需要在DTD中使用ELEMENT来定义当前xml中可以出现的标签名称。
格式:
<!ELEMENT 标签名 约束> 约束来限定当前标签中可以有的子标签,或者当前标签中可以书写的内容
在定义标签名的时候,约束中可以使用一些符号标签具体出现次数
? 零次或者一次
* 零次或者多次
+ 一次或者多次 users (user+) 表示当前的users标签下可以有一个或者多个user标签
, 用来限定当前的子标签出现的顺序user (name,age,addr) user标签下只能有name age addr 子标签,并且必须按照name age addr的顺序书写
| user (name|age,addr) user下可以name或者age ,但必须有addr,并且addr必须name或age后面
#PCDATA 表明该元素可包含任何字符数据,但不能在其中包含任何子元素。只有 PCDATA 的元素通过圆括号中的 #PCDATA 进行声明
EMPTY 表明该元素不能有任何子元素或文本,仅可以使用属性。
ANY 表该元素中可以包含任何DTD中定义的元素内容 如:<!ELEMENT note ANY>
<!ELEMENT age EMPTY > 当前的age标签是个空标签,它不能有文本内容。
属性
属性的类型:
CDATA 属性的value值可以是文本数据
(值1 | 值2 | 值3.... ) 表示当前的属性的value值只能是当前括号中的值
ID 表示唯一。对当前标签上的id属性进行限定,并且同一个xml中id不能重复 类型 描述
CDATA 值为字符数据 (character data)
(en1|en2|..) 此值是枚举列表中的一个值
ID 值为唯一的 id
IDREF 值为另外一个元素的 id
IDREFS 值为其他 id 的列表
NMTOKEN 值为合法的 XML 名称
NMTOKENS 值为合法的 XML 名称的列表
ENTITY 值是一个实体
ENTITIES 值是一个实体列表
NOTATION 此值是符号的名称
xml: 值是一个预定义的 XML 值
属性的类型和约束的组合:
CDATA REQUIRED
CDATA Implied
CDATA fixed
CDATA “值”
(值1 | 值2 | 值3.... ) REQUIRED
ID REQUIRED
实体
实体用于为一段内容创建一个别名,以后在XML文档中就可以使用别名引用这段内容了。
在DTD定义中,一条<!ENTITY …>语句用于定义一个实体。
实体可以理解成Java中预先定义好的一个常量,然后xml文件中就可以引入当前这个定义的实体。
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE users[
<!ELEMENT users (user+) >
<!ELEMENT user (name,age,addr) >
<!ELEMENT name (#PCDATA) >
<!ELEMENT age EMPTY >
<!ELEMENT addr (#PCDATA) >
<!ATTLIST user id ID #REQUIRED >
<!ENTITY abc "上海传智播客123123">
]>
<users>
<user id="u001">
<name>zhangsan</name>
<age></age>
<addr>&abc;</addr>
</user>
<user id="u002">
<name>lisi</name>
<age/>
<addr>&abc;</addr>
</user>
</users>
二、Schema约束xml
1、xml Schema介绍
Schema它也来约束xml文件的,DTD在约束xml的时候一个xml中只能引入一个DTD,同时DTD它无法对属性以及标签中的数据做数据类型的限定。
Schema它是用来代替DTD来约束xml。
Schema文件本身就是使用xml文件书写的,同时它对需要约束的xml中的数据有严格的限定。学习Schema主要来学习W3C组织定义的如何在Schema中去约束xml的标签以及属性,还有属性的数据类型,以及标签中子标签的顺序。
要定义一个Schema文件,这时它的扩展名必须是.xsd。在这个文件中根元素必须是schema。
使用Schema来约束xml,Schema在书写的时候,只需要使用W3C组织提前定义的限定标签的,以及限定的属性的那个标签即可。
2、Schema快速入门
第一步:书写xml文件
<?xml version="1.0" encoding="UTF-8"?>
<books>
<book>
<name>JavaWEB</name>
<author>老毕</author>
<price>182</price>
</book>
<book>
<name>SSH</name>
<author>老于</author>
<price>152</price>
</book>
</books>
第二步:定义schema文件
在定义Schema文件的时候,由于这个Schema文件本身就是xml,它也要受到别的约束。而这个约束是W3C组织提前定义好的,
在Schema文件中需要提前引入进来在根标签中使用属性进行进入:
<schema xmlns="http://www.w3.org/2001/XMLSchema" 引入W3C定义的schema书写的规范
targetNamespace="http://www.itcast.org/book" 给当前的Schema文件起名字(命名空间)
作用是当哪个xml要引入这个schema约束的时候,必须通过当前targetNamespace 后面书写的uri地址来引入
<?xml version="1.0" encoding="UTF-8"?>
<schema xmlns="http://www.w3.org/2001/XMLSchema"
targetNamespace="http://www.itcast.org/book"
elementFormDefault="qualified">
<element name="books">
<complexType>
<sequence>
<element name="book">
<complexType>
<sequence>
<element name="name"></element>
<element name="author"></element>
<element name="price"></element>
</sequence>
</complexType>
</element>
</sequence>
</complexType>
</element>
</schema>
第三步:在xml文件中引入当前的这个Schema
<books xmlns="http://www.itcast.org/book" 它是schema文件中的targetNamespace 属性后面的值
xsi:schemaLocation="http://www.itcast.org/book book.xsd" 这个是在引入当前的schema文件的真实路径
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 说明当前的xml是schema一个实例文档
>
3、Schema的名称空间
在定义Schema文件的时候,需要在<schema>根标签中使用
targetNamespace 属性定义当前schema定义名称(只是一个分配的名字,根本没有指向任何文件),在被约束的xml文件中先根据这个名称引入当前的schema文件,然后在使用
xsi:schemaLocation=”” 引入具体的schema文件。(因为targetNamespace属性定义的schema名称,只是一个名称而已,所以在xml文件中需要通过schemaLocation来声明指定所遵循的Schema文件的具体位置)
(xsi:schemaLocation 使用它引入某个schema时,先要使用名称空间, 空格 ,文件名) 名称空间主要功能是用于来
elementFormDefault="qualified|unqualified"
在schema中书写qualified ,在限定xml中的定义的标签名必须使用定义的名称空间。
unqualified 要求根元素必须使用名称空间,而子元素不能使用名称空间。
4、Schema中的标签解释
<?xml version="1.0" encoding="UTF-8"?>
<schema xmlns="http://www.w3.org/2001/XMLSchema"
targetNamespace="http://www.itcast2.org/book"
elementFormDefault="qualified">
<element name="books"> <!--name代表当前的xml中可以书写标签名称 type数据类型-->
<complexType ><!-- complexType 当前的element声明的标签是复杂标签时 ,需要使用complexType来声明子标签-->
<sequence> <!-- 复杂标签是指有属性,或者有子标签,或者有属性有子标签的标签
简单标签是指只有文本内容的标签
<name>zhangsan</name> 简单标签
<name id="u001"></name> 复杂标签
sequence 代表当前子标签的顺序
-->
<element name="book" maxOccurs="unbounded">
<complexType mixed="true"><!—mixed属性值为true,book元素间就可以出现字符文本数据了-->
<sequence>
<element name="name"></element>
<element name="author"></element>
<element name="price" type="integer"></element>
<any></any>
</sequence>
</complexType>
</element>
</sequence>
</complexType>
</element>
</schema>
Name.xsd
<schema xmlns="http://www.w3.org/2001/XMLSchema"
targetNamespace="http://www.example.org/name"
elementFormDefault="qualified">
<element name="name"></element>
</schema>
Book2.xml
<?xml version="1.0" encoding="UTF-8"?>
<aa:books xmlns:aa="http://www.itcast2.org/book"
xmlns:bb="http://www.example.org/name"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.itcast2.org/book book2.xsd
http://www.example.org/name name.xsd"
>
<aa:book>
aa:sjdlkfjlkdsjflk
<aa:name >JavaWEB</aa:name>
<aa:author >老毕</aa:author>
<aa:price>182</aa:price>
<bb:name>sdgs</bb:name>
</aa:book>
</aa:books>
此文转载于https://www.cnblogs.com/cb0327/ 详细请看https://www.cnblogs.com/cb0327/p/4967782.html#_label2_0
xml的约束的更多相关文章
- XML(二)之DTD——XML文件约束
前面介绍了XML的作用和基本的格式,今天我给大家分享的是关于XML的约束.废话不多说,我们直接来正题! 一.DTD简介 1.1.DTD概述 DTD(Document Type Definition,文 ...
- XML文件定义约束
今天在做Android项目的时候,用到了XML解析,服务端返回的不是JSON,而是XML,这时候就需要我们解析XML了,当然在解析XML的时候,需要了XML文件的定义结构,任何一个文件的定义都是要遵循 ...
- 【javaweb学习】XML和约束模式
xml:可扩展标记语言,w3c组织发布的,用于保存有关系的数据,作为配置文件,描述程序模块之间的关系 <?xml version="1.0" encoding="g ...
- XML的约束(schema)
XML Schema也是一种用于定义和描述XML文档结构与内容的模式语言,其出现是为了克服DTD的局限性 XML Schema符合XML语法结构 DOM.SAX等XML API很容易解析出XML Sc ...
- XML的约束(dtd)
DTD(Document Type Definition),文档类型定义,DTD文件应使用UTF-8或Unicode 1.XML中有多少个元素,就在dtd文件中写几个 <!ELEMENT&g ...
- xml 引入约束文件
<?xml version="1.0" encoding="UTF-8"?> <web-app version="2.5" ...
- XML DTD约束 对xml文件的crud的查询Read Retrieve操作 xml递归遍历
本地的dtd文档 xml中引入dtd文档 <?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE 书 ...
- 【Javaweb学习笔记】XML和约束模式
一.XML语法 xml 可扩展标记语言,w3c组织发布的,用于保存有关系的数据,作为配置文件,描述程序模块之间的关系 xml 文件开头必须包括下面的标签: <?xml version=" ...
- XML约束——Schema约束
XML Schema 也是一种用于定义和描述 XML 文档结构与内容的模式语言,其出现是为了克服 DTD 的局限性 XML Schema VS DTD: •XML Schema符合XML语法结构. • ...
随机推荐
- 基于Flink构建全场景实时数仓
目录: 一. 实时计算初期 二. 实时数仓建设 三. Lambda架构的实时数仓 四. Kappa架构的实时数仓 五. 流批结合的实时数仓 实时计算初期 虽然实时计算在最近几年才火起来,但是在早期也有 ...
- 小哈学Python ----XML
XML XML是实现不同语言或程序之间进行数据交换的协议,XML文件格式如下: <data> <country name="Liechtenstein"> ...
- Apache Superset 1.2.0教程 (三)—— 图表功能详解
通过之前章节的学习,我们已经成功地安装了superset,并且连接mysql数据库,可视化了王者英雄的数据.使用的是最简单Table类型的图表,但是superset还支持非常多的图表类型. 本文我们将 ...
- Vue全局弹窗:一次注册,全局可弹
Vue全局弹窗 今天来搞一个全局弹窗,不用每个文件都引入,只在main.js里作为全局原型引入就好了 先新建弹窗组件 toast.vue <template></template&g ...
- 做词云时报错cannot import name ‘WordCloud‘ from partially initialized module ‘wordcloud‘的解决办法
问题: 在做词云时,运行时出现该问题,wordcloud安装成功,但运行出错,错误提示是:cannot import name 'WordCloud' from partially initializ ...
- Real DOM和 Virtual DOM 的区别?优缺点?
一.是什么 Real DOM,真实DOM, 意思为文档对象模型,是一个结构化文本的抽象,在页面渲染出的每一个结点都是一个真实DOM结构,如下: Virtual Dom,本质上是以 JavaScript ...
- 前端开发入门到进阶附录一【JQuery中parent(),parents(),parentsUntil()区别和使用技巧】
JQuery中parent(),parents(),parentsUntil()区别和使用技巧:https://blog.csdn.net/china1223/article/details/5193 ...
- 标准化R包开发流程
3个武器: devtools:各种开发小工具的合集,让开发变得简单,非常实用 roxygens:通过注释的方式,生成文档,远离LaTex的烦恼 testthat:单元测试,让R包稳定.健壮.减少升级的 ...
- POJ3264线段树求最值
刚开始还觉得有点怪怪的.因为想着如果每个树只是单纯地记录它所在的区间的话会不会有不在区间内的数据给更新了,但是我好像是傻掉了因为如果有这种情况出现的话在父亲节点就会分成l,mid和mid+1,r两个区 ...
- Splay与FHQ-Treap
两个一起学的,就放一块了. 主要是用来存板子. Splay //This is a Splay Tree. #include <cstdio> #include <cstring&g ...