在XML中定义了一套规则,来对文档内容进行约束,这叫做XML约束
常用的俩种约束语言:DTD约束、Schema约束
XML文档中可以引入多个约束文档,为了防止出现不同含义的同名名称冲突,所以,所以可以XML提供了名称空间
1. DTD语法:
DTD约束是不支持名称空间的
在XML文件中引入外部DTD约束:
1.引入本地DTD约束
<!DOCTYPE 根元素 SYSTEM "外部DTD文件的URI">
2.引入公共DTD约束
<!DOCTYPE 根元素 PUBLIC DTD名称" "外部DTD文件的URI">
元素定义:
<!ELEMENT 元素名称 元素内容>
元素名称是XML文档中的元素
元素内容是对元素包含内容的声明,包含数据类型和符号共有五种内容格式
1.#PCDATA :表示元素中嵌套的内容是普通文本字符串
<!ELEMENT 书 (#PCDATA)>
2.子元素:表示元素包含的的元素
<!ELEMENT 书 (书名,价格,数量)>
3.混合内容:表示既要包含字符数据又要包含子元素,混合内容必须被定义零个或多个
<!ELEMENT 书 (#PCDATA|书名,价格,数量) *>
4.EMPTY:表示该元素即不包含字符数据又不包含子元素是一个空元素
<!ELEMENT br EMPTY >
5.ANY:表示该元素包含任何的字符数据和子元素
<!ELEMENT br ANY >
注意:混合内容中 * 的意义及其他符号的意义
问号?:表示该对象出现0次或1次
星号 * :表示该对象出现0次或多次
加号 + :表示该对象出现1次或多次
竖线 | :表示在列出的对象中选择一个
逗号 , :表示对象按照指定的顺序出现
括号 () :表示给元素进行分组
属性定义:
<!ATTLIST 元素名
属性名 属性类型 设置说明>
设置说明有4种
1.#REQUIRED 表示元素的该属性是必需的
2.#IMPLIED 表示元素可以包含该属性,也可以不包含
3.#FIXED 表示一个固定的属性默认值,使用时,需要提供一个默认值,该默认值不可变
4.默认值 如果元素不包含该属性,该属性将自动设置为默认值,但该默认值可以改变
属性类型:
1.CDATA
最常用的一种元素类型,表明属性类型是字符类型
2.Enumerated
表明属性类型是枚举类型,限制属性的取值只能从一个列表中选择
例如:
<!ATTLIST 肉
品种 (鸡肉|牛肉|猪肉) "鸡肉"
>
3.ID
用于唯一标识XML文档中的元素,且设置类型必须为REQUIRED或IMPLIED
注意:属性值不可以数字开头
4.IDREF 和 IDREFS
在ID之间建立一对一或者一对多联系,这个属性类型的属性值必须是一个已经存在的ID类型的属性值
建立一对一的关系
<!DOCTYPE 联系人列表[
<!ELEMENT 联系人列表 (#PCDATA)>
<!ELEMENT 联系人 (#PCDATA)>
<!ATTLIST 联系人
编号 ID #REQUIRED
上司 IDREF #IMPLIED
>
]>
<联系人列表>
<联系人 编号="id1">
</联系人>
<联系人 编号="id2" 上司="id1">
</联系人>
</联系人列表>
建立一对多的关系
<!DOCTYPE libary[
<!ELEMENT libary (book,person)>
<!ELEMENT book (#PCDATA)>
<!ELEMENT person (#PCDATA)>
<!ATTLIST book
bookID #REQUIRED
>
<!ATTLIST person
bookroed IDREFS #REQUIRED
>
]>
<libary>
<book bookID="id1">
</book>
<book bookID="id2">
</book>
<book bookID="id3">
</book>
<person bookroed="id1 id2">
</person>
<person bookroed="id2 id3 id1">
</person>
</libary>
5.NMTOKEN和NMTOKENS
NMTOKENS表示一种列表类型,一个元素类型中的NMTOKENS类型的属性值可以是同一个XML文件中的另外NMTOKEN类型的属性的属性值
6.NOTATION
通过设置NOTATION类型的属性可以让一个外部应用程序去处理无法或者难以使用XML格式组织的数据,如图像,声音,影像
定义语句:
<!NOTATION 符号名 SYSTEM "MIME类型">
<!NOTATION 符号名 SYSTEM "URL路径名">
例如:
<!DOCTYPE 文件[
<!NOTATION mp SYSTEM "movplayer.exe">
<!NOTATION gif SYSTEM "Image/gif">
<!ELEMENT 文件 ANY>
<!ELEMENT 电影 EMPTY>
<!ATTLIST 电影 演示设备 NOTATION(mp|gif) #REQUIRED>
]>
<文件>
<电影 演示设备="mp">
</文件>
7.ENTITY和ENTITYS
这俩个属性类型用到了实体,其中,
实体的定义有俩种:
<!ENTITY 实体名称 "实体内容">
<!ENTITY 实体名称 SYSTEM "外部文档的URI">
引用实体的方式:
&实体名称;
引用实体的意义:用以解决xml文档中内容重复的问题
ENTITY
对应的中文意思是实体,当某个属性的类型定义为ENTITY时,表明其属性值必须为在DTD中使用<!ENTITY...>语法的定义的一个实体的引用
例如:
DTD片段:
<!ENTITY itcast "交流论坛,www.hnhwy.xyz">
<!ELEMENT 电影 EMPTY>
<!ATTLIST 电影 来源 NOTATION(mp|gif)#REQUIRED>
XML数据片段:
<电影 来源="&itcast;"/>
ENTITYS表示一种列表类型,一个元素的ENTITYS类型的属性设置值可以是多个实体的引用每个实体的引用通过空格隔开
例如:
DTD片段:
<!ENTITY banner SYSTEM"http://www.hnhwy.xyz/imgs/topword.gif">
<!ENTITY login SYSTEM"http://www.hnhwy.xyz/imgs/logo.gif">
<!ELEMENT 电影 EMPTY>
<!ATTLIST 电影 来源 NOTATION(mp|gif)#REQUIRED>
XML数据片段:
<img src="banner login">
2.Schema语法
Schema是支持名称空间的
名称空间的声明语法:
1.<元素名 xmlns:prefixname=”URI”>xmlns:prefixname是指该元素的属性名
2.如果,多个元素位于同一个名称空间,可以设置默认名称空间 <元素名xmlns=”URI”>
XML文档中引入Schema约束文档
1. 使用名称空间引入Schema约束文档
2. <?xml version="1.0" encoding="UTF-8"?>
3. <beans xmlns="http://www.springframework.org/schema/beans"
4. xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
5. xmlns:myns="http://www.mycompany.com/schema/myns"
6. xsi:schemaLocation="
7. http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
8. http://www.mycompany.com/schema/myns http://www.mycompany.com/schema/myns/myns.xsd">
9. </beans>
第3,5俩行代码声明了在beans myns俩个元素上的名称空间
xsi:schemaLocation属性是用来指定名称空间的名称和Schema的文档位置
即第一个URI是名称空间名称,第二个URI是文档位置
xsi:schemaLocation属性是在标准名称空间
http://www.w3.org/2001/XMLSchema-instance中定义的,
2,不使用名称空间引入Schema文档
<beans xmlns:xsi=http://www.w3.org/2001/XMLSchema-instance
xsi:noNamespaceSchemaLocation=” http://www.springframework.org/schema/beans/spring-beans.xsd”
>
</beans>
通过xsi:noNamespaceSchemaLocation属性来引入约束文档位置,xsi:noNamespaceSchemaLocation属性也是定义在标准名称空间http://www.w3.org/2001/XMLSchema-instance
Schema语法
1. 元素定义
<xs:elementname="xxx" type="yyy">
xxx:元素名称
yyy:元素的数据类型
Schema中的数据类型:
xs:string表示字符串类型
xs:decimal表示小数类型
xs:integer表示整数类型
xs:boolean表示布尔类型
xs:date 表示日期类型
xs:time表示时间类型
例如
<xs:elementname="lastname" type="xs:string">
<xs:elementname="age" type="xs:integer">
<xs:elementname="dateborn" type="xs:date">
xml文档实例
<lastname>liming</lastname>
<age>28</age>
<dateborn>2018-05-09</dateborn>
2. 属性定义
<xs:attributename="xxx" type="yyy">
常用属性数据类型与常用元素数据类型一样
例如
<xs:elementname="lastname" type="xs:string">
<xs:attribute name="lang"type="xs:string"/>
</xs:element>
xml文档实例
<lastnamelang="EN">liming</lastname>
3.简单类型
只包含字符数据的元素都是简单类型,简单类型使用xs:simpleType元素来定义
想对现有元素内容的类型进行限制,则需要使用xs:restriction元素来定义
<xs:enumeration/>元素对一组值的限定,也就是定义为枚举约束
<xs:pattern/>元素对一系列值的限定
<xs:whiteSpace value="preserve"/>元素对空白字符的限定
<xs:enumeration/>元素对一组值的限定,也就是定义为枚举约束
<xs:minInclusive/>和<xs:maxInclusive/>元素对值的限定
例如:
<xs:element name="age">
<xs:simpleType>
<xs:restriction base="xs:integer">
<xs:minInclusive value="18" />
<xs:maxInclusive value="58" />
</xs:restriction>
</xs:simpleType>
</xs:element>
4.复杂类型
复杂类型通过<xs:complexType/>
复杂类型有4种基本类型
1. 空元素(只包含属性,不包含内容的元素)
Schema约束文档
<xs:element name="product">
<xs:compleType>
<xs:attribute name="prodid" type="xs:positiveInteger">
</xs:compleType>
</xs:element>
XML文档实例
<product prodid=”1234”/>
2. 包含其他元素的元素
Schema文档约束
<xs:element name="person">
<xs:compleType>
<xs:sequence>
<xs:element name ="firstname" type="xs:string">
<xs:element name ="lastname" type="xs:string">
</xs:sequence>
</xs:compleType>
</xs:element>
XML文档实例
<persion>
<firstname>lisi</firstname>
<lastname>zhangsan</lastname>
</persion>
3.仅仅包含文本的元素
Schema约束文档
<xs:element name="shoesize">
<xs:compleType>
<xs:simpleContent>
<xs:extension bast="xs:integer">
<xs:attribute name="country" type="xs:string"/>
</xs:extension>
</xs:simpleContent>
</xs:compleType>
</xs:element>
xml文档实例
<shoesize country=”france”>35</shoesize>
4.包含元素和文本的元素
Schema文档约束
<xs:element name="letter">
<xs:compleType>
<xs:sequence>
<xs:element name ="name" type="xs:string">
<xs:element name ="orderid" type="xs:positiveInteger">
<xs:element name ="shipdate" type="xs:date">
</xs:sequence>
</xs:compleType>
</xs:element>
xml文档
<letter>
Dear Mr.<name>John</name>
Your order<orderid>1032</ordered>
Will be shipsed on<shipdate>2018-09-23</shipdate>
</letter>