作业:xml练习2-写.xml的外部约束文件(dtd文件)
写外部DTD:
步骤:
1.在srd目录下新建DTD文件,并命名为:scores.dtd
2.在练习1的基础上,剪切练习1的DTD内部声明。粘贴到一个新建的DTD文件中。剪切之后的地方换上:包含外部DTD的声明语句:<!DOCTYPE scores SYSTEM "scores.dtd">,新建的引入外部DTD文件的xml文件如下:
<?xml version="1.0" encoding="UTF-8"?> <!-- 引入外部DTD文件 --> <!DOCTYPE scores SYSTEM "scores.dtd"> <scores> <student id="1"> <name>王同</name> <course>java</course> <score>89</score> </student> <student id="2"> <name>李佳</name> <course>sql</course> <score>58</score> </student> <student id="3"> <name>王二狗</name> <course>经济学原理</course> <score>88</score> </student> <student id="4"> <name>刘德华</name> <course>怎样做一个好演员</course> <score>100</score> </student> </scores>
3.其中,scores.dtd文件的内容如下:
<?xml version="1.0" encoding="UTF-8"?> <!ELEMENT scores (student+)> <!ELEMENT student (name,course,score)> <!ATTLIST student id CDATA #REQUIRED> <!ELEMENT name (#PCDATA)> <!ELEMENT course (#PCDATA)> <!ELEMENT score (#PCDATA)>
4.一个可能要注意的地方是,当引入外部约束文件DTD文件之后,.xml文件就要包含元素name,course,score 了,如果在.xml文件中删去<score>100</score> 这一行,会报错(必须匹配name,course,score),如果没报错,把文件保存一下就行了。
下面是来自韩顺平老师上课的例子1(xml文件及其对应的约束文件):
1.xml文件:
<?xml version="1.0" encoding="UTF-8"?> <!--文件名:学生信息管理 --> <!--关键字'SYSTEM'代表.DTD文件来源于当前系统,而不是来源于网络 --> <!DOCTYPE 班级 SYSTEM "学生信息管理.dtd"> <班级> <学生 地址="香港" 学号="tj1710008" 大哥="tj1710009 tj1710008" 性别="男" > <姓名>刘德华</姓名> <年龄>23</年龄> <简单介绍>学习刻苦!</简单介绍> </学生> <学生 地址="台湾" 学号="tj1710009" 大哥="tj1710008 tj1710009" 性别="女" > <姓名>林志玲</姓名> <年龄>22</年龄> <简单介绍>学习刻苦!认真听讲!</简单介绍> </学生> </班级>
2.对应的dtd约束文件:
<?xml version="1.0" encoding="UTF-8"?> <!--文件名:学生信息管理 --> <!ENTITY % myname "姓名"> <!--对于文件中多次出现的长字串,可以定义参数实体去替换 --> <!ELEMENT 班级 (学生+)> <!ELEMENT 学生 (%myname;,年龄,简单介绍)> <!--对于文件中多次出现的长字串,可以定义参数实体去替换 --> <!--"#REQUIRED"代表属性值是"必须"的 --> <!--"地址"这两个字是属性名字,是可以自定义的 --> <!--"ID"代表学号的属性值惟一,不可重复 --> <!--"DREFS"代表大哥的属性值是参考其他属性(学号)的属性值,DREF加个"S"代表可以有多个参考 --> <!--"(男|女)"代表是枚举,性别的属性值只能从括号中的值里面选择--> <!ATTLIST 学生 地址 CDATA #REQUIRED 学号 ID #REQUIRED 大哥 IDREFS #REQUIRED 性别 (男|女) #REQUIRED > <!--(#PCDATA)代表简单介绍可以是任何文本 --> <!ELEMENT %myname; (#PCDATA)> <!--对于文件中多次出现的长字串,可以定义参数实体去替换 --> <!ELEMENT 年龄 (#PCDATA)> <!ELEMENT 简单介绍 (#PCDATA)> <!--引用实体在dtd文件里面定义,在xml文件中使用,最好定义在最后面,目的是给一串字符串起个别名--> <!ENTITY mycopy "我的公司版权"> <!--此时"我的公司版权"这一个长字符串在xml文件里面可以用"mycopy"代替,如果需要引用这个长字串的话-->
例子2:
1.dtd文件:
<!-- the filename is catalog.dtd --> <!-- A Sample Product Catalog DTD --> <!-- This sample file is provided by Vervet Logic, for tutorial use with XML Pro. Questions should be addressed to "support@vervet.com" or visit our web site at http://www.vervet.com --> <!ENTITY AUTHOR "John Doe"> <!ENTITY COMPANY "JD Power Tools, Inc."> <!ENTITY EMAIL "jd@jd-tools.com"> <!ELEMENT CATALOG (PRODUCT+)> <!ELEMENT PRODUCT (SPECIFICATIONS+, OPTIONS?, PRICE+, NOTES?)> <!ATTLIST PRODUCT NAME CDATA #IMPLIED CATEGORY (HandTool | Table | Shop-Professional) "HandTool" PARTNUM CDATA #IMPLIED PLANT (Pittsburgh | Milwaukee | Chicago) "Chicago" INVENTORY (InStock | Backordered | Discontinued) "InStock"> <!ELEMENT SPECIFICATIONS (#PCDATA)> <!ATTLIST SPECIFICATIONS WEIGHT CDATA #IMPLIED POWER CDATA #IMPLIED> <!ELEMENT OPTIONS (#PCDATA)> <!ATTLIST OPTIONS FINISH (Metal | Polished | Matte) "Matte" ADAPTER (Included | Optional | NotApplicable) "Included" CASE (HardShell | Soft | NotApplicable) "HardShell"> <!ELEMENT PRICE (#PCDATA)> <!ATTLIST PRICE MSRP CDATA #IMPLIED WHOLESALE CDATA #IMPLIED STREET CDATA #IMPLIED SHIPPING CDATA #IMPLIED> <!ELEMENT NOTES (#PCDATA)>
2.对应的xml文件:
<?xml version="1.0" encoding="UTF-8"?> <!--the filename is 产品.dtd --> <!DOCTYPE CATALOG SYSTEM "catalog.dtd"> <CATALOG> <PRODUCT CATEGORY="HandTool" INVENTORY="InStock" NAME="得胜" PARTNUM="abc" PLANT="Chicago"> <SPECIFICATIONS WEIGHT="150KG" POWER="3000瓦">这里放说明书。</SPECIFICATIONS> <OPTIONS FINISH="Matte" ADAPTER="Included" CASE="HardShell">这里是操作说明。</OPTIONS> <PRICE>整机价格:RMB12000</PRICE> <NOTES>这里写注意事项!</NOTES> </PRODUCT> </CATALOG>