XML约束
什么是约束
DTD约束
Schema约束
什么是约束
由于XML的标签是完全自定义的可以去写任何标签,标签内也可以写任何内容,为了去规范去定义只能有哪些标签,标签的内容只能有哪些类型只能是什么。这个时候就需要写约束文件来应用到需要的XML里面。约束有两种方式一种是dtd,第二种是schema,前者相对简单但功能相比schema较弱
dtd约束
首先导入dtd约束
一种是直接写在xml里面
声明语句<!DOCTYPE 根元素[元素定义都在其中]>
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE persons[
<!ELEMENT students (student*)>
<!ELEMENT student (name,age,sex)>
<!ELEMENT name (#PCDATA)>
<!ELEMENT age (#PCDATA)>
<!ELEMENT sex (#PCDATA)>
<!ATTLIST student number ID #REQUIRED>
]>
<persons>
<person>
<name></name>
<age></age>
<sex></sex>
</person>
</persons>
第二种是外部导入
声明语句
本地<!DOCTYPE 根元素 SYSTEM "文件名"
网络<!DOCTYPE 根元素 PUBLIC "地址" "文件名">
student.dtd
<!ELEMENT students (student*) >
<!ELEMENT student (name,age,sex)>
<!ELEMENT name (#PCDATA)>
<!ELEMENT age (#PCDATA)>
<!ELEMENT sex (#PCDATA)>
<!ATTLIST student number ID #REQUIRED>
student.xml
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE students SYSTEM "student.dtd">
<students>
<student number="a001">
<name>张三</name>
<age>18</age>
<sex>男</sex>
</student>
<student number="a002">
<name>李四</name>
<age>20</age>
<sex>男</sex>
</student>
</students>
dtd的语法
在 DTD 中,XML 元素通过元素声明来进行声明。元素声明语句
<!ELEMENT 元素名称 类型>
或
<!ELEMENT 元素名称 (元素内容)>
类型有三种
EMPTY:空内容的元素
ANY:内容为任何形式
(#PCDATA):内容不包含子元素,即只能是文本内容
定义一个空类型的元素
<!ELEMENT student EMPTY>
那么XML里只能这么写
<student/>
定义一个可以填任意内容的元素
<!ELEMENT student ANY>
那么XML里这个元素可以这样写
<student>
我是学生
<age></age>
<name></name>
</student>
定义一个内容只能是文本的元素
<!ELEMENT student (#PCDATA)>
那么XML里这个元素中不能包含子元素<student>
我是学生
</student>
声明元素包含的子元素有且仅出现一次
<!ELEMENT 元素名 (子元素)>
声明元素包含的子元素至少一次
<!ELEMENT 元素名 (子元素+)>
声明元素包含的子元素可以有0次或多次
<!ELEMENT 元素名 (子元素*)>
声明元素包含的子元素只能出现0次或1次
<!ELEMENT 元素名 (子元素?)>
声明元素包含的子元素选其一"或者"的关系
<!ELEMENT 元素名 (子元素1|子元素2)>
多个子元素顺序要按照dtd中声明的顺序
定义包含子元素的元素
<!ELEMENT books (book*)>
<!ELEMENT book (name,author,version)>
<!ELEMENT name (#PCDATA)>
<!ELEMENT author (#PCDATA)>
<!ELEMENT version (#PCDATA)>
在XML中
<books>
<book>
<name>书1</name>
<author>作者1</author>
<version>1.0</author>
</book>
<book>
<name>书1</name>
<author>作者1</author>
<version>1.0</author>
</book>
</books>
属性声明
声明语句<!ATTLIST 元素名 属性名 属性类型 默认值 >
属性类型比如有
CDATA:字符类型
(en1|en2|en3····):枚举类型值只能在其中
ID:值不能有一样的
默认值有
"值":直接给出默认值
#REQUIRED:标注此属性必须写
#IMPLIED:此属性可以不写
#FIXED "值" :此属性值是固定的给出的值
dtd中
<!ELEMENT student ANY>
<!ATTLIST student sex (男|女) #REQUIRED>xml中
<student sex="男"></student>
默认值为#REQUIRED则student的sex属性一定得写
还有实体声明
声明语句
<!ENTITY 实体名 "实体值">
这样通过引用实体来引用某些值
引用语句: &实体名;
dtd中
<!ELEMENT student ANY>
<!ATTLIST student sex (男|女) #REQUIRED><!ENTITY a "男">那么xml中就可以这样写
<student sex="&a;"></student>
scheme约束
XML Schema 可针对未来的需求进行扩展
XML Schema 更完善,功能更强大
XML Schema 基于 XML 编写
XML Schema 支持数据类型
XML Schema 支持命名空间
定义简单元素
<xs:element name="xxx" type="yyy"/>
就是不包含子元素,内容类型直接定义为数据类型
或者自定义类型
有复杂类型和简单类型
可以直接写在标签内部,或者在外面定义
<xs:element name="employee">
<xs:complexType>
<xs:sequence>
<xs:element name="firstname" type="xs:string"/>
<xs:element name="lastname" type="xs:string"/>
</xs:sequence>
</xs:complexType>
</xs:element>
<xs:element name="employee" type="personinfo"/>
<xs:complexType name="personinfo">
<xs:sequence>
<xs:element name="firstname" type="xs:string"/>
<xs:element name="lastname" type="xs:string"/>
</xs:sequence>
</xs:complexType>
属性的定义
<xs:attribute name="xxx" type="xxx"/>
除此之外还有各种指示器,或者限制来约束值的范围等
笔记目的 : 对约束做简单了解会写一点简单的约束能看得懂外部导入的约束
勤学如春起之苗,不见其增,只有所长。辍学如磨刀之石,不见其增,日有所亏
愿你的今天胜过昨天
本文分享自微信公众号 - IT那个小笔记(qq1839646816)。
如有侵权,请联系 support@oschina.cn 删除。
本文参与“OSC源创计划”,欢迎正在阅读的你也加入,一起分享。