DTD约束
1.DTD(Document Type Definition)文件类型定义是用来约束XML文档,由于XML的可扩展,因此我们用dtd来约束XML文档中的元素(Element)和属性(Attribute).
a.对元素的声明: (XML文档中允许出现的标签)
<!ELEMENT 元素名称 元素类型>
如为元素内容:则需要使用()括起来,如
<!ELEMENT 书架 (书名,作者,售价)>
<!ELEMENT 书名 (#PCDATA)>
#PCDATA: 表示"书名"中嵌套的内容为普通文本字符串.
这里的PCDATA被解析的字符数据(parsed character data),PCDATA 是会被解析器解析的文本,与其相反的不会被解析CDATA区域内容
具体可以参考:http://xuqin.blog.51cto.com/5183168/887799
如为元素类型,则直接书写,DTD规范定义了如下几种类型:
EMPTY:用于定义空元素,例如<br/> <hr/>
ANY:表示元素内容为任意类型。
元素内容中可以使用如下方式,描述内容的组成关系
•用逗号分隔,表示内容的出现顺序必须与声明时一致。
<!ELEMENT MYFILE (TITLE,AUTHOR,EMAIL)>
• 用|分隔,表示任选其一,即多个只能出现一个(也就是"或"的意思)
<!ELEMENT MYFILE (TITLE|AUTHOR|EMAIL)>
•元素内容使用空格符分隔,表示出现顺序没有要求:
<!ELEMENT MYFILE (TITLE AUTHOR EMAIL)> *
在元素内容中也可以使用+、*、?等符号表示元素出现的次数:(含义和在正则表达式中的一致)
+: 一次或多次 (书+)
?: 0次或一次 (书?)
*: 0次或多次 (书*)
l也可使用圆括号( )批量设置,例
<!ELEMENT MYFILE ((TITLE*, AUTHOR?, EMAIL)* | COMMENT)>
b.对元素的属性定义:
<!ATTLIST 元素名
属性名1 属性值类型设置说明
属性名2 属性值类型设置说明
……
>
例如:
<!ATTLIST 商品
类别 CDATA #REQUIRED
颜色 CDATA #IMPLIED
>
•#REQUIRED:必须设置该属性
•#IMPLIED:可以设置也可以不设置
•#FIXED:说明该属性的取值固定为一个值,在 XML 文件中不能为该属性设置其它值。但需要为该属性提供这个值
•直接使用默认值:在 XML 中可以设置该值也可以不设置该属性值。若没设置则使用默认值。
常用的属性值类型:
CDATA:表示属性值为普通文本字符串。
ENUMERATED :相当于枚举类型
例如:在一个XML文档中:
1: <?xml version = "1.0" encoding="GB2312" standalone="yes"?>2: <!DOCTYPE 购物篮 [3: <!ELEMENT 肉 EMPTY>4: <!ATTLIST 肉 品种 ( 鸡肉 | 牛肉 | 猪肉 | 鱼肉 ) "鸡肉"> <!--肉的品种只能是()中的其中一种,默认值"鸡肉"-->5: ]>6: <购物篮>7: <肉 品种="鱼肉"/>8: <肉 品种="牛肉"/>9: <肉/>10: </购物篮>
ID
表示属性的设置值为一个唯一值。
ID 属性的值只能由字母,下划线开始,不能出现空白字符
例如:
1: <?xml version = "1.0" encoding="GB2312" ?>2:
3: <!DOCTYPE 联系人列表[4: <!ELEMENT 联系人列表 ANY>5: <!ELEMENT 联系人(姓名,EMAIL)>6: <!ELEMENT 姓名(#PCDATA)>7: <!ELEMENT EMAIL(#PCDATA)>8: <!ATTLIST 联系人 编号 ID #REQUIRED>9: ]>10:
11: <联系人列表>12: <联系人 编号="a1">13: <姓名>张三</姓名>14: <EMAIL>zhang@it315.org</EMAIL>15: </联系人>16: <联系人 编号="a2">17: <姓名>李四</姓名>18: <EMAIL>li@it315.org</EMAIL>19: </联系人>20: </联系人列表>ENTITY(实体),在后面的综合例子中展现
2.XML文档引用dtd文档进行约束:
book.xml:
1: <?xml version="1.0" encoding="GBK" standalone="no"?>2: <!DOCTYPE 书架 SYSTEM "book.dtd"> <!--从外部引用dtd文档,book.xml与book.dtd在同一目录下,DOCTYPE与SYSTEM 所有字母均大写-->3: <书架>4: <书>5: <书名>&bookname;</书名>6: <作者 姓名="王五"/>7: <售价>50元</售价>8: <页面作者 个人爱好="上网" 网站职务="页面作者" 联系信息=""/>9: </书>10: </书架>11: <!--12: 1. #REQUIRED :网站职务="设计",页面作者元素中一旦写了网站职务属性,那么该属性的值只能写 "页面作者"13: 否则报错: Attribute "网站职务" with value "设计" must have a value of "页面作者"14: 2.对于属性个人爱好的属性值,你写了,其属性值可以任意更改,但是不写默认为 "上网"15: -->
book.dtd:
1: <!ENTITY % commonType "CDATA">2: <!ENTITY % name "(张三|李四|王五)"><!--参数实体:在dtd文件内部使用-->3: <!ENTITY bookname "java web"> <!--引用实体:在xml文档中通过&bookname;引用-->4:
5: <!ELEMENT 书架 (书+)>6: <!ELEMENT 书 (书名,作者,售价,页面作者)>7: <!ELEMENT 书名 (#PCDATA)>8: <!ELEMENT 作者 (#PCDATA)>9: <!ELEMENT 售价 (#PCDATA)>10: <!ELEMENT 页面作者 (#PCDATA)>11: <!ATTLIST 页面作者12: 姓名 %commonType; #IMPLIED13: 年龄 CDATA #IMPLIED14: 联系信息 CDATA #REQUIRED15: 网站职务 CDATA #FIXED "页面作者"16: 个人爱好 CDATA "上网"17: >18: <!ATTLIST 作者19: 姓名 %name; #REQUIRED20: >21: <!--这里相当与:22: 姓名 (张三|李四|王五) #REQUIRED23: -->24: <!--25: 网站职务 CDATA #FIXED "页面作者":固定值26: 个人爱好 CDATA "上网": 默认值-->27:
28:
不论是参数实体还是引用实体都起到了一改全改的作用,提高代码复用性.看一下新建的一个html文档:1: <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">2: <html xmlns="http://www.w3.org/1999/xhtml">3: <head>4: <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />5: <title>无标题文档</title>6: </head>7:
8: <body>9: </body>10: </html>第一行: DOCTYPE(文档类型定义语句)中PUBLIC关键字:表明该html文件所遵循的是一个由权威机构制定的,公开提供给特定行业或公共使用的DTD文件,而不是某个组织内部的规范文件,我们可以在浏览器的地址栏输入该网址下载到该dtd文件,里面就是对html文档的约束.
第二行:<html xmlns="http://www.w3.org/1999/xhtml">具体可以参考W3C的教程:http://www.w3school.com.cn/tags/tag_prop_xmlns.asp第四行:参照:http://www.w3school.com.cn/tags/tag_meta.asp#meta_prop_http-equiv 其中charset="utf-8"那么浏览器的html解析引擎会以utf-8解码
3.最后根据dtd文件来写出相应的xml文档:
<!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 PRODUCTNAME CDATA #IMPLIEDCATEGORY (HandTool|Table|Shop-Professional) "HandTool"PARTNUM CDATA #IMPLIEDPLANT (Pittsburgh|Milwaukee|Chicago) "Chicago"INVENTORY (InStock|Backordered|Discontinued) "InStock"><!ELEMENT SPECIFICATIONS (#PCDATA)><!ATTLIST SPECIFICATIONSWEIGHT CDATA #IMPLIEDPOWER CDATA #IMPLIED><!ELEMENT OPTIONS (#PCDATA)><!ATTLIST OPTIONSFINISH (Metal|Polished|Matte) "Matte"ADAPTER (Included|Optional|NotApplicable) "Included"CASE (HardShell|Soft|NotApplicable) "HardShell"><!ELEMENT PRICE (#PCDATA)><!ATTLIST PRICEMSRP CDATA #IMPLIEDWHOLESALE CDATA #IMPLIEDSTREET CDATA #IMPLIEDSHIPPING CDATA #IMPLIED><!ELEMENT NOTES (#PCDATA)>相应的xml文档: (不止一种书写形式)<?xml version="1.0" encoding="UTF-8" ?><!DOCTYPE CATALOG SYSTEM "CATALOG.dtd"><CATALOG><PRODUCT NAME="电脑桌" CATEGORY="Table" PLANT="Chicago"><SPECIFICATIONS>产品说明</SPECIFICATIONS><OPTIONS></OPTIONS><PRICE></PRICE></PRODUCT></CATALOG>