ESSAY / NOTE

XML DTD约束基础2-DTD语法

 DTD元素l         语法
<!ELEMENT NAME CONTENT>
以上三个单词分别对应关键字、元素名称、元素类型(大写); CONTENT包括以下三种: 1)EMPTY:该元素不能包含子元素和文本,但是可以有属性(即空元素); 示例:
<!ELEMENT 人 EMPTY> <家庭> <人名字="皮诺曹"性别="男"年龄="6"/> </家庭>
2)ANY:该元素可以包含任何在DTD中定义的元素内容; 示例:
<!ELEMENT 人 ANY> <家庭> <人>皮诺曹</人> <人><大人>皮诺曹爸爸</大人></人> </家庭>
3)#PCDATA:可以包含任何字符数据,但是不能再其中包含任何子元素其它类型(组合)。
<!ELEMENT 人 (#PCDATA)> <家庭> <人性别="男"年龄="6">皮诺曹</人> </家庭>
组合类型如下所示:
<!ELEMENT 家庭 (人+,家电*)> <家庭> <人名字="郭大路"性别="男"年龄="25"/> <人名字="李寻欢"性别="男"年龄="38"爱好="作个教育家和伟人"/> <家电名称="彩电"数量="3"/> </家庭>
修饰符如下所示:

编号

符号

用途

示例

示例说明

1

( ) 用来给元素分组 (古龙|金庸),(王朔|余杰),三毛 分成三组

2

| 在列中的对象中选择一个 (男人|女人) 表示男人或者女人必须出现,两者至少选一

3

+ 该对象最少出现一次,可以出现多次 (成员+) 表示成员必须出现,而且可以出现多个成员

4

* 该对象允许出现零次到人一多次 (爱好*) 爱好可以出现零次到多次

5

? 该对象可以出现,但是只能出现一次(0到1次) (菜鸟?) 菜鸟可以出现,也可以不出现,但是如果出现的话,最多只能出现一次

6

, 对象必须按指定的顺序出现 (西瓜,苹果,香蕉) 表示西瓜,苹果,香蕉必须出现,并且按这个顺序出现

4.3、属性

a、语法:
<!ATTLIST 元素名称 属性名称类型属性特点 属性名称类型属性特点... >
其中类型包括四种:CDATA、ID、IDREF/IDREFS、Enumerated、ENTITY/ENTITIES; 属性特点包括四种:#REQUIRED、#IMPLIED、#FIXED value、#Default value。 b、属性类型: l         CDATA:属性值可以使任何字符(包括数字和中文)
<!ATTLIST 木偶 姓名 CDATA #REQUIRED > <木偶姓名="dirk"> <木偶姓名="德克"> <木偶姓名="dirk41">
l         ID:表明该属性的取值必须是唯一的。
<!ELEMENT 公司职员 ANY> <!ATTLIST 公司职员 编号 ID #REQUIRED 姓名 CDATA #REQUIRED > <公司职员编号="1001"姓名="张三"> <公司职员编号="1002"姓名="李四">
l         IDREF/IDREFS:IDREF属性的值指向文档中其它地方声明的ID类型的值; IDREFS同IDREF,但是可以具有由空格分开的多个引用。
<!ELEMENT 家庭(人+)> <!ELEMENT 人 EMPTY> <!ATTLIST 人 relID ID #REQUIRED parentID IDREFS #IMPLIED name CDATA #REUIRED > <家庭> <人 relID="p01" name="爸爸"> <人 relID="p02" name="妈妈"> <人 relID="p03" parentID="p01 02" name="儿子"> </家庭>
l         Enumerated:事先定义好一些值,属性的值必须在所列出的值的范围内。
<!ATTLIST person 婚姻状态(single|married|divorced|widowed) #IMPLIED> <!ATTLIST person 性别(男|女) #REQUIRED>
c、属性的特点: l         #REQUIRED:元素的所有实例都必须有该属性的值(NOT NULL)。 语法:
<!ATTLIST 元素名属性名属性类型 #REQUIRED>
示例:
<!ATTLIST person number CDATA #REQUIRED> <person number="5678"/>
l         #IMPLIED:元素的实例中可以忽略该属性(NULL)。 语法:
<!ATTLIST 元素名属性名属性类型 #IMPLIED>
示例:
<!ATTLIST contact fax CDATA #IMPLIED> <contact fax="555-667788">
l         #FIXED value:元素实例中该属性的值必须为指定的固定值。 语法:
<!ATTLIST 元素名属性名属性类型 #FIXED "value">
示例:
<!ATTLIST sender company CDATA #FIXED "Microsoft"> <sender company="Microsofr"/>
l         Default value:为属性听过一个默认的值。 语法:
<!ATTLIST 元素名属性名类型 "value">
示例:
<!ATTLIST payment type CDATA "check"> <payment type="check"/>
d、实体: l         定义:是用于为一段内容创建一个别名,以后再xml文档中就可以使用别名引用这段内容了,在DTD定义中,一条<!ENTITY ...>语句用于定义一个实体;实体可以分为两种类型:引用类型和参数实体。 l         引用实体:主要在xml文档中被应用; 语法:
<!ENTITY 实体名称 "实体内容">:直接转变成实体内容
引用方式:
&实体名称;
示例:
<!ENTITY copyright "I am a coder"> &copyright;
l         参数实体:被DTD文档自身使用; 语法:
<!ENTITY  %实体名称 "实体内容">
引用方式:
%实体名称;
示例:
<!ENTITY % TAG_NAMES "姓名|EMAIL|电话|地址"> <!ENTITY 个人信息 (%TAG_NAME;|生日)> <!ENTITY 客户信息 (%TAG_NAME;|公司名)>
<!ENTITY %common.attributes id ID #IMPLIED account CDATA #REQUIRED > ... <!ATTLIST purchaseOrder %common.attributes;> <!ATTLIST item %commo.attributes;>
  e、练习: 根据以下的dtd文件写出相对应的xml文件: 1)报纸文章 DTD
!DOCTYPE NEWSPAPER [ <!ELEMENT NEWSPAPER (ARTICLE+)> <!ELEMENT ARTICLE (HEADLINE,BYLINE,LEAD,BODY,NOTES)> <!ELEMENT HEADLINE (#PCDATA)> <!ELEMENT BYLINE (#PCDATA)> <!ELEMENT LEAD (#PCDATA)> <!ELEMENT BODY (#PCDATA)> <!ELEMENT NOTES (#PCDATA)> <!ATTLIST ARTICLE AUTHOR CDATA #REQUIRED> <!ATTLIST ARTICLE EDITOR CDATA #IMPLIED> <!ATTLIST ARTICLE DATE CDATA #IMPLIED> <!ATTLIST ARTICLE EDITION CDATA #IMPLIED> <!ENTITY NEWSPAPER "Vervet Logic Times"> <!ENTITY PUBLISHER "Vervet Logic Press"> <!ENTITY COPYRIGHT "Copyright 1998 Vervet Logic Press"> ]>
<?xml version="1.0" encoding="utf-8"?> <!DOCTYPE NEWSPAPER SYSTEM "newspaper.dtd"> <NEWSPAPER> <ARTICLE AUTHOR="steven" EDITOR="dirk" DATE="2012" EDITION="china"> <HEADLINE>let us go mavs</HEADLINE> <BYLINE>let us go dirk</BYLINE> <LEAD>Mavs</LEAD> <BODY>huangwenbo</BODY> <NOTES>sanjiangunivesity</NOTES> </ARTICLE> </NEWSPAPER>
2)产品目录 DTD
<!DOCTYPE CATALOG [ <!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)> ]>
<?xml version="1.0" encoding="utf-8"?> <!DOCTYPE CATALOG SYSTEM "product.dtd"> <CATALOG> <PRODUCT NAME="lenovo" CATEGORY="HandTool" PARTNUM="abc" PLANT="Chicago" INVENTORY="InStock"> <SPECIFICATIONS WEIGHT="800" POWER="600">lenove y460p</SPECIFICATIONS> <OPTIONS FINISH="Matte" ADAPTER="Included" CASE="HardShell">123</OPTIONS> <PRICE>100</PRICE> </PRODUCT> </CATALOG>