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>

发表回复