本文主要是介绍XML解析-DTD约束(二),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
一 XML约束在XML技术里,可以编写一个文档来约束一个XML文档的书写规范,这称之为XML约束。
需要XML约束的原因
xml由于是可扩展的标记语言,所以在xml文件中的编写太过于自由,这样在很多种情况下并不合适。
常用的约束技术
XML DTD
DTD文件的后缀名为 .dtd
DTD文件有自己独立的语法规范
XML Schema
Schema文件的后缀名为 .xsd
Schema文件符合xml语法规范
二 DTD Document Type Define
DTD的定义:描述元素、属性和其他杂项在xml文档中的使用规则的说明
DTD的分类:外部的DTD 内部的DTD 混合的DTD
1).内部的DTD:DTD和xml文档在同一个文件中
例如:student1.xml文件:
<?xml version="1.0" encoding="UTF-8"?><!DOCTYPE students[<!ELEMENT students (stu+)><!ELEMENT stu (id,name,age)><!ELEMENT id (#PCDATA)><!ELEMENT name (#PCDATA)><!ELEMENT age (#PCDATA)>]><students><stu><id>1</id><name>tom</name><age>20</age></stu></students>
2).外部的DTD:DTD和xml文档不在同一个文件中
例如:xml/student2.xml文件 <?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE students SYSTEM "../dtd/student.dtd"><students><stu><id>1</id><name>tom</name><age>20</age></stu></students>
dtd/student.dtd文件:(注意文件的位置,在调用时../dtd/student.dtd表示退出当前目录,进入dtd目录)
<!ELEMENT students (stu+)><!ELEMENT stu (id,name,age)><!ELEMENT id (#PCDATA)><!ELEMENT name (#PCDATA)><!ELEMENT age (#PCDATA)>
3).混合的DTD:既有外部DTD,又有内部DTD
例如: xml/student3.xml文件
<?xml version="1.0" encoding="UTF-8"?><!DOCTYPE students SYSTEM "../dtd/student.dtd"[<!ELEMENT stu (id,name,age)><!ELEMENT id (#PCDATA)><!ELEMENT name (#PCDATA)><!ELEMENT age (#PCDATA)>]><students><stu><id>1</id><name>tom</name><age>20</age></stu></students>
dtd/student.dtd文件:
<!ELEMENT students (stu+)>
外部的DTD
引用外部dtd的时候又分为俩种:
SYSTEM表示引用的dtd文件在本地
例如:
<!DOCTYPE students SYSTEM "../dtd/student.dtd">
PUBLIC表示引用的dtd文件是一个公共的文件
格式:注意里面是可以加回车换行的
<!DOCTYPE 根元素 PUBLIC "" "">
例如:
<!DOCTYPE hibernate-configuration PUBLIC
"-//Hibernate/Hibernate Configuration DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd">
在后面的"如何在Eclipse中给xml文件添加标签自动提示功能"的部分再做说明
DTD的目的:
验证该xml文档是否是有效的xml文档
如果一个良构的xml文档满足了DTD的声明就是一个有效的xml文档。
注意:良构 不一定 有效,但是有效一定良构
DTD对xml文件中元素的约束:
格式:<!ELEMENT 元素名 (内容模式)>
内容模式:
1).EMPTY:元素不能包含子元素和文本(空元素)
例如:
dtd文件:
<!ELEMENT students (stu)><!ELEMENT stu EMPTY>xml文件:<students><!--这个stu元素中的内容必须为空--><stu></stu></students>
2).(#PCDATA):可以包含任何字符数据,但是不能在其中包含任何子元素
例如:
dtd文件:
<!ELEMENT students (stu)><!ELEMENT stu (#PCDATA)>xml文件:<students><stu>tom</stu></students>
3).ANY:元素内容为任意的,主要是使用在元素内容不确定的情况下
例如:
dtd文件:
<!ELEMENT students (stu)><!ELEMENT stu ANY>xml文件:<students><stu>tom</stu></students>或者<students><stu><name>tom</name></stu></students>
4).修饰符:() | + * ? , 默认修饰符
() 来给元素分用组
| 在列出的元素中选择一个
例如:
dtd文件:
<!ELEMENT students (stu|student)>
xml文件:
<students><!--这里只能出现stu元素或者student元素--><!--俩个元素任选其一,不能同时出现--></students>
+ 该元素最少出现一次,可以出现多次 (1或n次)
例如:
dtd文件:
<!ELEMENT students (stu+)>
xml文件:
<students><stu></stu><stu></stu><stu></stu></students>
* 该元素允许出现零次到任意多次(0到n次)
例如:
dtd文件:
<!ELEMENT students (stu*)>
xml文件:
<students><!--stu出现0次到n次--><stu></stu><stu></stu><stu></stu></students>
? 该元素可以出现,但只能出现一次 (0到1次)
例如:
dtd文件:
<!ELEMENT students (stu?)>
xml文件:
<students><!--stu出现0次到1次--><stu></stu></students>
, 对象必须按指定的顺序出现
例如:
dtd文件:
<!ELEMENT students (stu*)><!ELEMENT stu (id,name,age)>
xml文件:
<students><stu><id></id><name></name><age></age></stu></students>
默认修饰符 就是什么修饰符都没有加
例如:
dtd文件:
<!ELEMENT students (stu)>
xml文件:
<students><!--这里只能出现stu元素1次--><!--stu元素不出现也验证不通过--><stu></stu></students>
5).混合元素 子元素是任意类型 出现任意次数 并且没有出现顺序要求
例如:
dtd文件:
<!ELEMENT students (stu*)><!ELEMENT stu (#PCDATA|id|name|age)*>
xml文件:
<students><stu></stu><stu><id></id><name></name><age></age></stu><stu>tom</stu></students>
注意:
1 根元素students里面可以出现stu子元素0到n次
2 stu元素中可以写文本也可以写id、name、age子元素
3 id、name、age子元素出现的顺序没有要求
4 id、name、age子元素可以都出现也可以都不出现
注意:浏览器是非验证的解析器,不会验证xml的有效性,可以使用Eclipse去验证xml的有效性
DTD对xml文件中属性的约束:
格式:<!ATTLIST 元素名称
属性名称 值类型 属性特点
属性名称 值类型 属性特点
>
属性类型:
1).CDATA:属性值可以是任何字符(包括数字和中文)
例如:
dtd文件:
<!ELEMENT students (stu*)> <!ELEMENT stu (#PCDATA)><!ATTLIST stuid CDATA #REQUIREDname CDATA #REQUIRED>
xml文件:
<students><stu id="1" name="tom"></stu></students>
2).ID:属性值必须唯一,属性值必须满足xml命名规则
例如:
dtd文件:
<!ELEMENT students (stu*)><!ELEMENT stu (#PCDATA)><!ATTLIST stuid ID #REQUIREDname CDATA #REQUIRED>
xml文件:
<students><stu id="A1" name="tom"></stu><stu id="B1" name="tom"></stu></students>
注意:
1. id和name属性必须出现
2. id属性的值必须满足xml名字规范,例如不能数字开头
3. id属性的值不能重复
4. 多个属性的出现是没有顺序要求的
3).IDREF/IDREFS
IDREF属性的值指向文档中其它地方声明的ID类型的值。
IDREFS同IDREF,但是可以具有由空格分开的多个引用。
例如:
dtd文件:
<!ELEMENT students (stu*)><!ELEMENT stu (#PCDATA)><!ATTLIST stuid ID #REQUIREDpid IDREFS #IMPLIEDname CDATA #REQUIRED>
xml文件:
<students><stu id="A1" name="tom"></stu><stu id="B1" name="tom"></stu><stu id="C1" name="tom" pid="A1 B1"></stu></students>
注意:
1. id和name属性必须出现
2. pid属性出现可以,不出现也可以
3. id属性的值必须满足xml名字规范,例如不能数字开头
4. id属性的值不能重复
5. pid属性的值必须是引用其他stu元素的id值
6. pid属性的值可以是多个,使用空格隔开
7. 多个属性的出现是没有顺序要求的
4).enumerated:(枚举值1|枚举值2|枚举值3...),属性值必须在枚举值中
例如:
dtd文件:
<!ELEMENT students (stu*)><!ELEMENT stu (#PCDATA)><!ATTLIST stuid ID #REQUIREDname CDATA #REQUIREDgender (男|女) #REQUIRED>
xml文件:
<students><stu id="A1" name="tom" gender="男"></stu><stu id="B1" name="tom" gender="女"></stu></students>
注意:
1. id/name/gender属性必须出现
2. id属性的值必须满足xml名字规范,例如不能数字开头
3. id属性的值不能重复
4. gender属性的值必须是男或者女
5. 多个属性的出现是没有顺序要求的
属性特点:
1).#REQUIRED:元素的所有实例都必须有该属性
例如:
dtd文件:
<!ELEMENT students (stu*)><!ELEMENT stu (#PCDATA)><!ATTLIST stuname CDATA #REQUIRED>
xml文件:
<students><stu name=""></stu><stu name="tom"></stu></students>
注意:
1. name属性必须出现
2. name属性的值可以为空也可以不为空
2).#IMPLIED :属性可以不出现
例如:
dtd文件:
<!ELEMENT students (stu*)><!ELEMENT stu (#PCDATA)><!ATTLIST stuname CDATA #IMPLIED>
xml文件:
<students><stu name=""></stu><stu name="tom"></stu><stu></stu></students>
注意:
1. name属性可以出现也可以不出现
2. name属性的值可以为空也可以不为空
3).default-value:属性可以不出现,并且当它不出现的时候是有默认值的,而该属性的默认值就是atttibute-value
例如:
dtd文件:
<!ELEMENT students (stu*)><!ELEMENT stu (#PCDATA)><!ATTLIST stuname CDATA "tom">
xml文件:
<students><stu name="zhangsan"></stu><stu></stu></students>
注意:
1. name属性可以出现也可以不出现
2. name属性如果出现则默认值为tom
4).#FIXED :属性可以不出现,但是如果出现的话必须是指定的属性值
例如:
dtd文件:
<!ELEMENT students (stu*)><!ELEMENT stu (#PCDATA)><!ATTLIST stuname CDATA #IMPLIEDschool CDATA #FIXED "briup">
xml文件:
<students><stu school="briup"></stu><stu></stu></students>
注意:
1. name/school属性可以出现也可以不出现
2. school属性如果出现那么值一定要是briup
DTD文档的一个实例:
dtd文档:
<!ELEMENT students (student+)><!ELEMENT student (name,age?,score*)><!ATTLIST student id CDATA #REQUIRED><!ELEMENT name (#PCDATA)><!ATTLIST name firstName CDATA #IMPLIED><!ELEMENT age (#PCDATA)><!ATTLIST age xuAge CDATA #FIXED "20"><!ELEMENT score (#PCDATA)><!ATTLIST score sel (60|80|100) #REQUIRED>
利用DTD文件在Eclipse中给xml文件添加标签自动提示功能
利用schame文件在Eclipse中给xml文件添加标签自动提示功能
这篇关于XML解析-DTD约束(二)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!