微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

DTD约束

原文链接:http://www.cnblogs.com/yiqiu2324/archive/2014/02/04/3537881.html



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://www.jb51.cc/article/p-tuwajzof-bcp.html

如为元素类型,则直接书写,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 属性的值只能由字母,下划线开始,不能出现空白字符

例如:

="GB2312" ? 2:
   3:  联系人列表[
   4:      <!联系人列表 ANY   5:      联系人(姓名,EMAIL)   6:      姓名(#PCDATA)EMAIL(#联系人 编号 ID #required   9:  ]  10:  
  11:  联系人列表  12:      编号="a1"  13:          姓名>张三  14:          EMAIL>zhang@it315.org  15:       联系人  16:      ="a2"  17:          >李四  18:          >li@it315.org  19:        20:   ENTITY(实体),在后面的综合例子中展现

2.XML文档引用dtd文档进行约束:

book.xml:

version="1.0" ="GBK" ="no"?书架 SYstem "book.dtd"> <!--从外部引用dtd文档,book.xml与book.dtd在同一目录下,DOCTYPE与SYstem 所有字母均大写-->
书架   4:  书名>&bookname;作者 ="王五"售价>50元页面作者 个人爱好="上网" 网站职务="页面作者" 联系信息=""   9:     11:  <!--
  12:  1. #required :网站职务="设计",页面作者元素中一旦写了网站职务属性,那么该属性的值只能写 "页面作者"
  13:  否则报错: Attribute "网站职务" with value "设计" must have a value of "页面作者"
  14:  2.对于属性个人爱好的属性值,你写了,其属性值可以任意更改,但是不写认为 "上网"
  15:   -->

book.dtd:

ENTITY % commonType "CDATA"name "(张三|李四|王五)"><!--参数实体:在dtd文件内部使用-->
ENTITY bookname "java web"> <!--引用实体:在xml文档中通过&bookname;引用-->
   4:  
   5:  书架 (+) (书名,0)">作者,0)">售价,0)">页面作者)   7:  书名 (#   8:  作者 (#   9:  售价 (#页面作者 (#页面作者
  12:     姓名  %commonType; #IMPLIED
  13:     年龄    CDATA #IMPLIED
  14:     联系信息 required
  15:     网站职务 FIXED "页面作者"
  16:     个人爱好 CDATA "上网"   
  17:      18:   作者 
  19:      姓名   %name; #required 
  20:     21:   <!--这里相当与:
  22:       姓名  (张三|李四|王五) #required
  23:    -->
  24:   <!--
  25:   网站职务 CDATA #FIXED "页面作者":固定值
  26:   个人爱好 CDATA "上网": 认值-->
  27:   
  28:   
不论是参数实体还是引用实体都起到了一改全改的作用,提高代码复用性.
看一下新建的一个html文档:
html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
xmlns="http://www.w3.org/1999/xhtml">
headMeta http-equiv="Content-Type" content="text/html; charset=utf-8" />
title>标题文档   7:  
bodyhtml第一行: DOCTYPE(文档类型定义语句)中PUBLIC关键字:表明该html文件所遵循的是一个由权威机构制定的,公开提供给特定行业或公共使用的DTD文件,而不是某个组织内部的规范文件,我们可以在浏览器的地址栏输入该网址下载到该dtd文件,里面就是对html文档的约束.
第二行:<>具体可以参考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文档:

AUTHOR "John Doe"COMPANY "JD Power Tools,Inc."EMAIL "jd@jd-tools.com"CATALOG (PRODUCT+)PRODUCT
(SPECIFICATIONS+,0)">OPTIONS?,0)">PRICE+,0)">NOTES?)NAME CATEGORY (HandTool|Table|Shop-Professional) "HandTool"
PARTNUM PLANT (Pittsburgh|Milwaukee|Chicago) "Chicago"
INVENTORY (InStock|Backordered|discontinued) "InStock"SPECIFICATIONS (#SPECIFICATIONS
WEIGHT POWER IMPLIEDOPTIONS (#OPTIONS
FINISH (Metal|Polished|Matte) "Matte" 
ADAPTER (Included|Optional|NotApplicable) "Included"
CASE (HardShell|Soft|"HardShell"PRICE (#PRICE
MSRP WHOLESALE STREET SHIPPING NOTES (#
相应的xml文档: (不止一种书写形式)
="UTF-8" ?CATALOG "CATALOG.dtd"CATALOG    PRODUCT NAME="电脑桌" CATEGORY="Table" PLANT="Chicago"        SPECIFICATIONS           产品说明
        OPTIONS        
PRICE        
 
    PRODUCT>

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。