DTD技术快速入门
1.DTD与xml关联三种方式
1.内部DTD —– 语法
<!DOCTYPE 你的xml文档的根元素名称 [元素声明]>
2.外部DTD (引用本地DTD)
<!DOCTYPE 你的xml文档的根元素名称 SYSTEM "本地DTD文件位置">
3.公共DTD (引用网络上DTD)
<!DOCTYPE 你的xml文档的根元素名称 PUBLIC “公共名称" "URL">
<!--* 公共DTD 使用 名称 W3C规范官方组织规定的-->
文档实例
<?xml version="1.0"?>
<!DOCTYPE note [
<!--定义此文档是 note 类型的文档。-->
<!ELEMENT note (to,from,heading,body)>
<!-- note 元素有四个元素:"to、from、heading,、body"-->
<!ELEMENT to (#PCDATA)>
<!--to 元素为 "#PCDATA" 类型-->
<!ELEMENT from (#PCDATA)>
<!--如上-->
<!ELEMENT heading (#PCDATA)>
<!--如上-->
<!ELEMENT body (#PCDATA)>
]>
<note>
<to>George</to>
<from>John</from>
<heading>Reminder</heading>
<body>Don't forget the meeting!</body>
</note>
语法
所有的 XML 文档(以及 HTML 文档)均由以下简单的构建模块构成:
1. 元素
2. 属性
3. 实体
4. PCDATA
5. CDATA
声明一个元素
在 DTD 中,XML 元素通过元素声明来进行声明。元素声明使用下面的语法:
<!ELEMENT 元素名称 类别>
<!ELEMENT 元素名称 (元素内容)>
<!--空元素-->
<!ELEMENT 元素名称 EMPTY>
<!--带有子元素(序列)的元素-->
<!ELEMENT 元素名称 (子元素名称 1,子元素名称 2,.....)>
<!--* 任意个(0到多个)-->
<!ELEMENT 元素名称 (子元素名称*)>
<!--+ (1到多个子元素) -->
<!ELEMENT 元素名称 (子元素名称+)>
<!--? (代表0或者1个子元素)-->
<!ELEMENT 元素名称 (子元素名称?)>
<!--声明“非.../既...”类型的内容-->
<!--"note" 元素必须包含 "to" 元素、"from" 元素、"header" 元素,以及非 "message" 元素既 "body" 元素-->
<!ELEMENT note (to,from,header,(message|body))>
<!--"note" 元素可包含出现零次或多次的 PCDATA、"to"、"from"、"header" 或者 "message"。-->
<!ELEMENT note (#PCDATA|to|from|header|message)*>
在 DTD 中,属性通过 ATTLIST 声明来进行声明。
语法
<!ATTLIST 元素名称 属性名称 属性类型 默认值>
<!ATTLIST payment type CDATA "check">
<!--xml对应的是-->
<payment type="check" />
以下是属性类型选项
属性类型 | 描述 |
---|---|
CDATA | 值为字符数据 (character data) |
(en1 | en2 |
ID | 值为唯一的 id |
IDREF | 值为另外一个元素的 id |
IDREFS | 值为其他 id 的列表 |
NMTOKEN | 值为合法的 XML 名称 |
NMTOKENS | 值为合法的 XML 名称的列表 |
ENTITY | 值是一个实体 |
ENTITIES | 值是一个实体列表 |
NOTATION | 此值是符号的名称 |
xml: | 值是一个预定义的 XML 值 |
默认值参数可使用下列值
默认值参数 | 解释 |
---|---|
REQUIERD | 属性必须 |
IMPLIED | 属性可选 |
fixed value | 属性值固定 |
default | 默认值 |
假如您不希望强制作者包含属性,并且您没有默认值选项的话,请使用关键词 #IMPLIED。
假如您没有默认值选项,但是仍然希望强制作者提交属性的话,请使用关键词 #REQUIRED。
如果您希望属性拥有固定的值,并不允许作者改变这个值,请使用 #FIXED 关键词。如果作者使用了不同的值,XML 解析器会返回错误。
规定一个默认的属性值
DTD:
<!--定义一个空的属性节点-->
<!ELEMENT square EMPTY>
<!--节点的默认属性值为0-->
<!ATTLIST square width CDATA "0">
<!--合法的 XML-->
<square width="100" />
<!--列举属性值-->
<!ATTLIST 元素名称 属性名称 (en1|en2|..) 默认值>
<!ATTLIST payment type (check|cash) "cash">