DTD元素l 语法
以上三个单词分别对应关键字、元素名称、元素类型(大写);
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”>
©right; |
l 参数实体:被DTD文档自身使用;
语法:
引用方式:
示例:
<!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> |