DTD
DTD : 对xml约束的规则
1,约束元素
1.1:元素出现的个数
1.2:元素出现的频率
1.3:元素出现的顺序
2,约束属性
2.1,什么属性可以出现必须出现
2.2,属性的值 可能是什么 |
2.3,能否文本
就是一套关于元素、属性以及其他杂项在xml文档中使用规则的声明。
DTD:可以限定:
标签,文本域,属性
DTD:Document Type Definition
1.定义一个xml文档的结构和顺序
2.用来限定验证xml文档的内容
3.强制xml文档的内容是一个合法的文档。----> 其实就是2的另一个说法。
4.可以包含在xml文档内部或者在一个独立的文件
5.DTD不描述允许出现在元素内部的数据
6.DTD不是基于xml的
7.可以被xml schema 覆盖
schema:也是一种xml约束
DTD的定义:
描述元素、属性和其他杂项在xml文档中
的使用规则的说明
DTD的分类:
1).外部的DTD:DTD和xml文档不在同一个文件中
怎么从外部引入
2).内部的DTD:DTD和xml文档在同一个文件中
在文件中又是写在哪,怎么写
3).混合的DTD:既有外部DTD,又有内部DTD
DTD的目的:
验证该xml文档是否是有效的xml文档
如果一个良构的xml文档满足了DTD的声明就是一个有效的xml文档。
注意:良构 不一定 有效,但是有效一定良构
引入DTD:语法:
内部嵌套:<!DOCTYPE 根元素 [dtd验证规则]>
引入外部:<!DOCTYPE 根元素 PUBLIC "公有id" "(网络)路径">
DTD在元素中的声明:
对元素限定:<!ELEMENT 元素名 内容模式>
对属性限定:
<!ATTLIST 元素名 属性名 属性类型 属性默认值
属性名 属性类型 属性默认值>
<!ELEMENT student (#PCDATA)>
:对student标签进行约束,student元素内容只能是字符或者为空
<!ELEMENT student (name,age)>
:对student标签进行约束,student元素中子标签只能是 按顺序出现 name标签和 age标签
约束标签:
格式:<!ELEMENT 元素名 内容模式>
内容模式:
1). (#PCDATA):元素内容为字符或者为空
2). EMPTY:元素内容为空
3). ANY:元素内容为任意的,主要是使用在元素内容不确定的情况下对子标签进行约束
4). (Child Elements): , | + * ?
,:表示元素必须顺序出现
|:表示多个元素中选一个
元素名上无符号:表示元素必须要出现1次
量词
+:表示元素可以出现1次到多次
*:表示元素可以出现0次到多次
?:表示元素可以出现0次到1次
5).混合元素
eg:<!ELEMENT root (#PCDATA|name|age)*>
<root>
<name></name>
<age></age>
</root>
子元素可以是name,也可以是age,顺序没有关系,频率也没有关系
注意:浏览器是非验证的解析器,不会验证xml的有效性
属性的DTD声明:attribute
格式:
<!ATTLIST 元素名 属性名 属性类型 属性默认值
.........
属性名 属性类型 属性默认值
>
属性类型:
1). ID :属性值必须唯一,属性值必须满足命名规则 —> 属性默认值:1 2 可以使用
2). (枚举值1|枚举值2|枚举值3…):属性值必须在枚举值中 —> 属性默认值:1 2 3 4 可以使用 -->但是要注意:属性的默认值如果现在3 4 ,值就只能是枚举值123… 中出现
3). CDATA:属性值为字符 —> 属性默认值:1 2 3 4 可以使用.
属性默认值:
1). #REQUIRED 属性必须出现在元素的开始标签中。
<!ATTLIST b name ID #REQUIRED>
2). #IMPLIED 属性可以不出现,并且当它不出现的时候没有默认值
<!ATTLIST b address (city|number|all) #IMPLIED>
3). “字符串” 属性可以不出现,并且当它不出现的时候是有默认值的,而该属性的默认值就是该字符串
<!ATTLIST b add (city|number|all) 'city'>
4). #FIXED 属性可以不出现,但是如果出现的话必须是指定的属性值,不出现的话也是指定的默认值
<!ATTLIST c number CDATA #FIXED 'asdf'>
schema:
1.命名空间
nameSpace:命名空间,元素、属性名称的集合,解决命名冲突问题
<s:student></s:student>
<h:student></h:student>
这里的两个student标签是不同的两个student标签,通过使用前缀,我们创建了两种不同类型的 <student>
元素。
2.命名空间使用注意
1)定义命名空间前缀,并应用在元素上,那么该元素下所有的子元素和属性都在该命名空间
<h:student xmlns:h="http://briup.com/h">
</h:student>
2)可以用xmlns定义默认命名空间,默认命名空间只作用于元素,不作用于属性
3)在根标签中可以定义命名空间前缀
多个命名空间前缀不能重名
多个命名空间前缀可以指向同一URI
<root xmlns:h="http://briup.com/h"
xmlns:s="http://briup.com/s" >
<h:student></h:student>
<s:student></s:student>
</root>
4)判断元素、属性是否相同,除了要看命名空间前缀和元素名/属性名外,还要看命名空间前缀所指向的URI是否相同
3.XML Schema简介
XML Shema和DTD一样,用来对XML文件的内容进行限制。
XML Schema中提供了一些内置数据类型,而且还允许用户自己定义Simple Type(简单类型),Complex Type(复杂类型)。
schema文件的格式是.xsd(xml schema document的缩写xsd)
<beans xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns="briup.bean"
xsi:schemaLocation="briup.bean bean.xsd">
</beans>
注:xmlns:xsi=http://www.w3.org/2001/XMLSchema-instance
,
表示遵守w3的xml schema规范,xml解析器解析xml文件时,就明白按照什么规范解析了。 当使用自定义的schema就需要添加改句。
<schema xmlns="http://www.w3.org/2001/XMLSchema"
targetNamespace="http://www.example.org/test2"
xmlns:tns="http://www.example.org/test2"
elementFormDefault="qualified">
</schema>
根元素包括模式的约束, xml模式空间命名的定义, 其他命名空间的定义, 版本信息, 语言信息和其他的信息.
xmlns="http://www.w3.org/2001/XMLSchema" : 使用默认的名称空间
targetNamespace="http://www.example.org/test2": 指定schema文档中声明的元素属于哪个命名空间
elementFormaDefault="qualified": 指定shema文档中声明的跟元素和所有子元素都属于targetnamespace锁指定的名称空间
xmlns:tns="http://www.example.org/test2" :target Name Space 指向 targetNamespace="http://www.example.org/test2"
对标签限定:
<element name="标签名" type="string" minOccurs="1" maxOccurs="1">
</element>
minOccus:限定元素最少出现次数
maxOccus:限定元素最多出现次数
对属性限定:
<attribute name="attName" type="string" use="" default="" fixed="">
</attribute>
name 属性名
type 属性值类型
use取值:
1)optional:表示属性可有可无
2)required:表示属性必须要有
3)prohibited:禁止的
4 XML Schema语法
4.1 SimpleType:定义一个 对 文本 的约束: 可以约束文本的 取值范围,和只能取什么值。
语法:
<simpleType name="num">
<restriction base="int"><!-- 基本类型为int -->
<minInclusive value="1"></minInclusive>
<maxInclusive value="10"></maxInclusive>
</restriction>
</simpleType>
文本/属性值:只能取值 1-10
使用 : <element name="b" type="tns:num"></element>
表示该标签的文本域值 只能是1-10之间
<simpleType name="gender">
<restriction base="string"><!-- 基本类型为string -->
<enumeration value="男"></enumeration>
<enumeration value="女"></enumeration>
</restriction>
</simpleType>
文本/属性值:只能取值 男 或 女
使用 : <attribute name="name" type="tns:gender"></attribute>
表示该属性只能取值男 或 女