由于xml是一种可扩展的标记语言,我们可以自己定义标签的写法,但我们在实际开发的时候,不能每人都按照自己的想法来写xml文件,因此我们需要规定xml中只能出现的元素。
xml中的约束技术:dtd约束和schema约束(看懂即可)
一、dtd约束
1、使用dtd定义元素(标签)
(1)语法
<!ELEMENT 元素名 约束>
(2)简单元素的定义
简单元素就是没有子元素的元素。
语法:<!ELEMENT name (#PCDATA)>
(#PCDATA):约束name是字符串类型
EMPTY:元素为空(没有内容)
ANY:任意
(3)复杂元素的定义
复杂元素就是有子元素的元素。
语法:<!ELEMENT 元素名称 (子元素)>
表示子元素出现的次数:
+:表示一次或者多次
?:表示零次或者一次
*:表示零次或者多次
子元素直接使用逗号隔开:表示元素出现的顺序;
子元素直接用 | 隔开:表示元素只能出现其中的任意一个。
举例:
<?xml version="1.0" encoding="UTF-8"?>
<!ELEMENT 书架 (书+)>
<!ELEMENT 书 (书名,作者,售价)>
<!ELEMENT 书名 (#PCDATA)>
<!ELEMENT 作者 (#PCDATA)>
<!ELEMENT 售价 (#PCDATA)>
(4)dtd文件的引用
语法:<!DOCTYPE 根元素名称 SYSTEM "文件的路径">
举例:
<?xml version="1.0" encoding="UTF-8"?>
<!--由于book.dtd文件在项目目录下,所以我们直接输入文件名即可>
<!DOCTYPE 书架 SYSTEM "book.dtd">
<书架>
<书>
<书名></书名>
<作者></作者>
<售价></售价>
</书>
</书架>
eclipse中可以实现dtd的快速引入:创建xml文件时,选择next --> Create XML file from a DTD file --> next --> 工作空间选择dtd --> finish。
2、使用dtd定义属性
(1)语法:
<!ATTLIST 元素名称 属性名称 属性类型 属性的约束>
(2)属性类型
- CDATA:字符串
例:
<!ATTLIST 商品 类别 CDATA #REQUIRED>
<商品 类别="abc"></商品>
- 枚举:表示只能在一定的范围内出现值,但是只能每次出现其中的一个
例:
<!ATTLIST 商品 颜色 (红色|黄色|蓝色) #REQUIRED>
<商品 颜色="红色"></商品>
- ID:值只能是字母和下划线开头且不能重复
<!ATTLIST 商品 价格 ID #REQUIRED>
<商品 价格="c001"></商品>
(3)属性的约束
#REQUIRED:属性必须存在
#IMPLIED:属性可有可无
#FIXED: 表示一个固定值,属性的值必须是设置的这个固定值
<!ATTLIST 商品 品种 CDATA #FIXED "ABC">
<商品 品种="ABC" />
直接值:如果不写属性,使用默认值;如果写了属性,使用设置那个值
<!ATTLIST 商品 颜色 CDATA "黄色">
<商品 />
(4)定义属性示例一
<!--为了使读者可以看清,所以讲属性进行了换行-->
<!ATTLIST 商品
类别 CDATA #REQUIRED
颜色 CDATA #IMPLIED
>
<商品 类别="服装"颜色="黄色" />
(5)定义属性示例二
<!DOCTYPE 购物篮 [
<!ELEMENT 购物篮 (肉+)>
<!ELEMENT 肉 EMPTY>
<!ATTLIST 肉 品种 ( 鸡肉 | 牛肉 | 猪肉 | 鱼肉 ) "鸡肉">
]>
<购物篮>
<肉 品种="鱼肉"/>
<肉 品种="牛肉"/>
<肉/>
</购物篮>
二、schema约束
1、schema的概述
schema约束符合xml的语法,xml语句。一个xml中可以有多个schema,多个schema使用名称空间区分(类似于java包名)xmlns(XML Namespaces的缩写)。
schema相较于xml可以支持更多的数据类型,且语法更为复杂,但是schema目前不能替代dtd。
2、schema的案例
(1)schema约束文件
<?xml version='1.0' encoding='UTF-8' ?>
<xs:schema xmlns:xs='http://www.w3.org/2001/XMLSchema' //固定的(标准名称空间):表示当前xml文件是一个约束文件
targetNamespace='http://www.itheima.com' //想使用schema约束文件,就直接通过这个地址引入约束文件
>
<xs:element name='书架' >
<xs:complexType>
<xs:sequence maxOccurs='unbounded' >
<xs:element name='书' >
<xs:complexType>
<xs:sequence>
<xs:element name='书名' type='xs:string' />
<xs:element name='作者' type='xs:string' />
<xs:element name='售价' type='xs:string' />
</xs:sequence>
</xs:complexType>
</xs:element>
</xs:sequence>
</xs:complexType>
</xs:element>
</xs:schema>
名词解释:
<sequence>:表示元素的出现的顺序
<complexType>:表示这是一个复杂元素,有子标签
maxOccurs="unbounded":表示元素出现的次数,没有限制
xmlns(XML Namespaces的缩写)默认命名空间,如文件中没有使用前缀,则采用该默认命名空间,如果后面有前缀,命名空间里面的元素或者属性就必须加上前缀,如:例子中的xs。
(3)根据约束文件写xml
<?xml version="1.0" encoding="UTF-8"?>
<it:书架 xmlns:it="http://www.itheima.com"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.itheima.com book.xsd">//引入schema: 名称空间 dtd文件名称(注意空格一定不能漏掉)
<it:书>
<it:书名>Java基础</it:书名>
<it:作者>张三</it:作者>
<it:售价>99.00元</it:售价>
</it:书>
</it:书架>
schema约束的快速引入:
创建xml文件的时候,选择next --> Create XML file from a DTD file --> next --> 工作空间选择xsd --> finish