2.xml约束技术----------dtd约束
1.xml的约束 (1)为什么需要定义约束了 比如现在定义一个person的xml文件,只想要这个文件里面保存人的信息,比如name age等,但是如果在xml文件中写了一个元素<猫>,发现可以正常显示,因为符合语法规范。但是猫肯定不是人的信息,xml的元素时自定义的,需要技术来规定xml中只能出现的元素,这个时候就需要约束了 xml的约束的技术:dtd约束 和 schema约束 ? 2.dtd的编写使用步骤(注意语法的格式,该打空格就打空格) (1)创建一个文件,后缀名为.dtd (2)在文件中写入约束 a.看xml中有多少个元素,有几个元素那么就在dtd文件中写几个<!ELEMENT>(大写) b.判断元素时简单元素还是复杂元素 - 复杂元素:由子元素(? 语法:<!ELEMENT 元素名字 (子元素1,子元素2...)>? ) - 简单元素:没有子元素(? 语法:<!ELEMENT 元素名字 (#PCDATA)>?? ) c.在xml文件中引入dtd文件 语法: <!DOCTYPE 根元素名称 SYSTEM "dtd文件的路径"> (3)注意 浏览器只负责检验xml的语法,不负责校验约束(责校约束,我们需要以来工具,比如Eclipse MyEclipse) ? 实例一:按照dtd约束进行定义xml元素 dtd约束代码如下: <!ELEMENT persion (name,age)> <!ELEMENT name (#PCDATA)> <!ELEMENT age (#PCDATA)> ? xml文件代码如下(按照dtd约束) <?xml version="1.0" encoding="GBK"?> <!DOCTYPE persion SYSTEM "Demo1.dtd"> <persion> <name>张三</name> <age>123</age> </persion> ? 浏览器显示 ? 实例二:不按照dtd约束定义xml元素 如果我们不按照dtd约束,那么Eclipse会提示错误,但是在浏览器中运行却可以显示 但浏览器正常显示 ? 3.dtd的三种引入方式 (1)使用外部的dtd文件(例如上面的实例就是使用这个方式) 语法:<!DOCTYPE 根元素名字 SYSTEM "dtd路径"> (2)在xml里面使用dtd文件 语法:<!DOCTYPE 根元素名字 [ <!ELEMENT persion (name,age)> <!ELEMENT name (#CPDATA)> <!ELEMENT age (#PCDATA)> ]> 例如代码如下: <?xml version="1.0" encoding="gbk"?> <!DOCTYPE persion [ <!ELEMENT persion (name,age,profession)><!--这个可写也可不写(最好还是写上)--> <!ELEMENT name (#PCDATA)> <!ELEMENT age (#PCDATA)> <!ELEMENT profession (student)> <!ELEMENT student (#PCDATA)> ]> <persion> <name>张三</name> <age>18</age> <profession> <student>学生</student> </profession> </persion> ? (3)使用网络上面的dtd文件(别人已经定义好了的) 语法:<!DOCTYPE 根元素 PUBLIC "dtd名字" "dtd文档的URL"> 框架struts2就会使用配置文件,并且使用的是网络上面的dtd文件 ? 4.使用dtd约束定义元素 (1)语法:<!ELEMENT 元素名 约束> (2)简单元素:没有子元素的元素 <!ELEMENT name (#PCDATA)> - (#PCDATA) :表示该元素可以包含字符串数据,但是不能包含子元素 - EMPTY:表示为空(就是没有内容,例如<a></a>) - ANY :表示可以包含任意类型数据 (2)复杂元素: <!ELEMENT persion (name,age)>? 表示子元素只能出现一次 <!ELEMENT persion (name+,age)>? 表示name元素可以出现一次或则多次 符号的意义: + :表示一次或者多次(>=1) ?:表示零次或者一次(==0或则==1) * :表示零次或者多次(>=0) ,:如果子元素直接用逗号分割,那么表示子元素出现的顺序 | :如果子元素用|分割,那么之元素只能出现其中一个 下面是一个例子: <?xml version="1.0" encoding="gbk"?> <!DOCTYPE persion [ <!ELEMENT persion (name+,age?,(profession*|aaa))><!--这个可写也可不写(最好还是写上)--> <!ELEMENT name EMPTY> <!ELEMENT age ANY> <!ELEMENT profession (#PCDATA)> ]> <persion> <name></name> <name></name> <!-- <age>18</age>这个因为是可以定义0次也可以1次,所以注释掉 --> <profession>学生1</profession> <profession>学生2</profession> <profession>学生3</profession> </persion> ? ? ?6.使用dtd定义属性约束(就如html中class,id等一样) (1)语法:<!ATTLIST 元素名字 属性名字 属性类型 属性约束 > (2)属性的值的类型 a.CDATA:字符串 例如:<!ATTLIST name ID1 CDATA #REQUIRED ? > b.枚举:表示只能在一定范围内出现的值,但是每次只能出现其中一个 例如:<!ATTLIST name ID1 (AA|BB|CC) #REQUIRED > c.ID : 属性的值只能是字符或者下划线开头 例如:<!ATTLIST name ID1 ID #REQUIRED > (3)属性约束 #REQUIRED : 属性必须存在 #IMPLIED : 属性可有可无 #FIXED : 表示一个固定值 #FIXED "AAA"(也就是属性的值必须是AAA,不能是其他的值) 默认值: 例如:<!ATTLIST name ID1 CDATA "WWW" > 如果我们在xml页面中给这个属性没有赋值,那么默认就是WWW,如果赋值了,那么就是自己赋的值 (4)实体 意义:我们在写xml的时候,元素里面的值可以引用这个实体(也就是先在dtd文件中定义,再到xml文件中使用) 语法:<!ENTITY TEXT "entity">----<!ENTITY 实体名 "实体值"> 调用:在元素中写?? &TEXT; 注意:定义实体需要写在内部的dtd里面,如果写在外部dtd里面,某些浏览器获取不到之个值 ? 实例代码如下: <?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE persion [ <!--定义元素约束--> <!ELEMENT persion (name,profession,default,entity)> <!ELEMENT name (#PCDATA)> <!ELEMENT age (#PCDATA)> <!ELEMENT profession (#PCDATA)> <!ELEMENT default (#PCDATA)> <!ELEMENT entity (#PCDATA)> <!--元素属性约束--> <!--name的值只能是这几个枚举之中的一个,并且必须写--> <!ATTLIST name ID1 (AA|BB|CC) #REQUIRED > <!--表示属性的值只能是字符或者下划线开头,并且这个属性可写可不写--> <!ATTLIST age ID2 ID #IMPLIED > <!--表示这个属性的值只能是WWW--> <!ATTLIST profession ID3 CDATA #FIXED "WWW" > <!--表示这个属性的值默认是default--> <!ATTLIST default ID4 CDATA "default" > <!--定义实体--> <!ENTITY TEXT "entity"> ]> <persion> <name ID1="AA"></name> <age ID2="_id"></age> <profession ID3="WWW"></profession> <default></default> <entity>&TEXT;</entity> </persion> ? (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |