事实上,约束在Java中是很常见的,但是我们很少去思考为什么需要用到约束呢?比如我们现在定义一个student.xml文件,我们想要在其中保存关于学生的信息,例如id,name,age,但是如果随便写入一个标签例如<你好>,从语法的角度上虽然是符合规范的,但是这显然与我们想要存储的东西没有任何关系,所以我们需要通过XML约束技术,约束XML中只能出现的元素。
XML约束技术分为两大类,一种相对简单的约束技术:DTD,一种相对复杂的约束技术:Schema。下面我们来大致说一下这两种约束的思路。
一、DTD约束
1.dtd的引入方式
A:使用内部的dtd文件,即将约束规则定义在xml文档中
<!DOCTYPE 根元素名称 [
<!ELEMENT person (name,age)>
<!ELEMENT name (#PCDATA)>
<!ELEMENT age (#PCDATA)>
]>
B:引入外部的dtd文件
<!DOCTYPE 根元素名称 SYSTEM "dtd路径">
C:使用外部的dtd文件(网络上的dtd文件)
<!DOCTYPE 根元素 PUBLIC "DTD名称" "DTD文档的URL">
例如使用 struts2框架 使用配置文件 所使用 外部的dtd文件
<!DOCTYPE struts PUBLIC "-//Apache Software Foundation//DTD
Struts Configuration 2.0//EN"
"http://struts.apache.org/dtds/struts-2.0.dtd">
2.使用dtd定义元素
<!ELEMENT 元素名 约束>
A:简单元素(没有子元素)
ELEMENT name (#PCDATA)>
(#PCDATA): 约束name是字符串类型
EMPTY : 元素为空(没有内容)
- <sex></sex>
ANY:任意
B:复杂元素
<!-- 语法 -->
<!ELEMENT person (id,name,age,)>
子元素只能出现一次
<!ELEMENT 元素名称 (子元素)>
<!-- 子元素出现次数 -->
* :一次多或多次
?:零次或一次
* :零次或多次
<!-- 子元素直接使用逗号隔开 -->
表示元素出现的顺序
<!-- 子元素直接使用 | -->
表示元素只能出现其中的任意一个
3.使用dtd定义属性
<!-- 语法 -->
<!ATTLIST 元素名称
属性名称 属性类型 属性的约束
>
<!-- 属性类型 --> CDATA: 字符串
<!ATTLIST birthday
ID1 CDATA #REQUIRED
>
<!-- 枚举 -->
表示只能在一定的范围内出现值,但是只能每次出现其中的一个,红绿灯效果
<!ATTLIST age
ID2 (AA|BB|CC) #REQUIRED
>
<!-- ID: 值只能是字母或者下划线开头 -->
<!ATTLIST name
ID3 ID #REQUIRED
>
<!-- 属性的约束 -->
#REQUIRED:属性必须存在
#IMPLIED:属性可有可无
#FIXED: 表示一个固定值 #FIXED "AAA"
属性的值必须是设置的这个固定值
<!ATTLIST sex
ID4 CDATA #FIXED "ABC"
>
直接值
不写属性,使用直接值
写了属性,使用设置那个值
<!ATTLIST school
ID5 CDATA "WWW"
>
二、Schema约束
schema 符合XML的语法,一个xml中可以有多个 schema ,多个 schema 使用名称空间区分DTD里面有PCDATA类型,但是在 schema 里面可以支持更多的数据类型。XML Schema也是一种用于定义和描述XML文档结构与内容的模式语言,其出现是为了克服DTD的局限性.
后缀名:xsd
引入:
填写xml文档的根元素
引入xsi前缀. xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
表示xml文件是一个约束文件
引入xsd文件命名空间. xsi:schemaLocation="http://www.bwh.cn/xml student.xsd"
使用一个使用schema约束文件,直接通过这个地址引入约束文件
通常使用一个url地址防止重名
为每一个xsd约束声明一个前缀,作为标识 xmlns="http://www.bwh.cn/xml"
1.看xml中有多少个元素
<element>
2.看简单元素和复杂元素
<element name="person">
<complexType>
<sequence>
<element name="name" type="string"></element>
<element name="age" type="int"></element>
</sequence>
</complexType>
</element>
3.被约束文件里面引入约束文件
<person xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns="http://www.bwh.cn/20151111"
xsi:schemaLocation="http://www.bwh.cn/20151111 1.xsd">
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
-- 表示xml是一个被约束文件
xmlns="http://www.bwh.cn/20151111"
-- 是约束文档里面 targetNamespace
xsi:schemaLocation="http://www.bwh.cn/20151111 1.xsd">
-- targetNamespace 空格 约束文档的地址路径
可以约束属性
A: <sequence>:表示元素的出现的顺序
B: <all>: 元素只能出现一次
C: <choice>:元素只能出现其中的一个
D: maxOccurs="unbounded": 表示元素的出现的次数
E: <any></any>:表示任意元素
写在复杂元素里面
写在 </complexType>之前
--
<attribute name="id1" type="int" use="required"></attribute>
- name: 属性名称
- type:属性类型 int stirng
- use:属性是否必须出现 required
XML约束本质上还是限制XML文档中创建的元素及属性,离不开它的字面意思。因为xml文档是可以自定义元素的,这会让使用xml文档的应用程序无法知道xml文档的真实结构,。通常应用程序都会要求xml文件的结构是固定的,以满足自己的需求,这就说明,不同的应用程序要求自己的xml文档必须符合一定的要求,也就是我们所说的XML约束。讲的再多,不如实战,本站的Java基础教程里面有着许多的XML文档,小伙伴看完了本文可以去小试牛刀。
你适合学Java吗?4大专业测评方法
代码逻辑 吸收能力 技术学习能力 综合素质
先测评确定适合在学习