DTD文件使用总结
1. 声明元素
1.1.声明格式
<!ELEMENT element-name category>
1.2 具体声明场景
- 声明只有文本内容的元素:
<!ELEMENT element-name (#PCDATA)>
- 声明有子元素的元素
<!ELEMENT element-name (child1)>或<!ELEMENT element-name (child1,child2,...)>
- 声明只出现一次的元素
<!ELEMENT element-name (child-name)>
实例: <!ELEMENT note (message)>
上面的例子声明了:message 子元素必须出现一次,并且必须只在 “note” 元素中出现一次。
- 声明最少出现一次的元素
<!ELEMENT element-name (child-name+)>
实例: <!ELEMENT note (message+)>
上面的例子中的加号(+)声明了:message 子元素必须在 “note” 元素内出现至少一次。
- 声明出现零次或多次的元素
<!ELEMENT element-name (child-name*)>
实例: <!ELEMENT note (message*)>
上面的例子中的星号(*)声明了:子元素 message 可在 “note” 元素内出现零次或多次。
- 声明出现零次或一次的元素
<!ELEMENT element-name (child-name?)>
实例: <!ELEMENT note (message?)>
上面的例子中的问号(?)声明了:子元素 message 可在 “note” 元素内出现零次或一次。
- 声明"非…/即…"类型的内容
实例: <!ELEMENT note (to,from,header,(message|body))>
上面的例子声明了: “note” 元素必须包含 “to” 元素、“from” 元素、“header” 元素,以及非 “message” 元素即 “body” 元素。
- 声明混合型的内容
实例: <!ELEMENT note (#PCDATA|to|from|header|message)*>
上面的例子声明了:“note” 元素可包含出现零次或多次的 PCDATA、“to”、“from”、“header” 或者 “message”。
1.3 声明时的注意点
顺序性: 当子元素按照由逗号分隔开的序列进行声明时,这些子元素必须按照相同的顺序出现在文档中
完整性: 在一个完整的声明中,子元素也必须被声明
2. 声明属性
2.1 声明格式
声明格式: <!ATTLIST element-name attribute-name attribute-type attribute-value>
示例: <!ATTLIST payment type CDATA "check">
2.2 属性类型
类型 | 描述 |
---|---|
CDATA | 值为字符数据 (character data) |
(en1|en2|…) | 此值是枚举列表中的一个值 |
ID | 值为唯一的 id |
IDREF | 值为另外一个元素的 id |
IDREFS | 值为其他 id 的列表 |
NMTOKEN | 值为合法的 XML 名称 |
NMTOKENS | 值为合法的 XML 名称的列表 |
ENTITY | 值是一个实体 |
ENTITIES | 值是一个实体列表 |
NOTATION | 此值是符号的名称 |
2.2 声明时attribute-value的可选值
值 | 解释 |
---|---|
具体的值 | 属性的默认值 |
#REQUIRED | 属性值是必需的 |
#IMPLIED | 属性不是必需的 |
#FIXED value | 属性值是固定的 |
示例:
- 默认值
<!ELEMENT square EMPTY>
<!ATTLIST square width CDATA "0">
合法的 XML:
<square width="100" />
- #REQUIRED
<!ATTLIST element-name attribute-name attribute-type #REQUIRED>
<!ATTLIST person number CDATA #REQUIRED>
合法的 XML:
<person number="5677" />
非法的 XML:
<person />
假如您没有默认值选项,但是仍然希望强制作者提交属性的话,请使用关键词 #REQUIRED。
- #IMPLIED
<!ATTLIST element-name attribute-name attribute-type #IMPLIED>
<!ATTLIST contact fax CDATA #IMPLIED>
合法的 XML:
<contact fax="555-667788" />
合法的 XML:
<contact />
假如您不希望强制作者包含属性,并且您没有默认值选项的话,请使用关键词 #IMPLIED。
- #FIXED
<!ATTLIST element-name attribute-name attribute-type #FIXED "value">
<!ATTLIST sender company CDATA #FIXED "Microsoft">
合法的 XML:
<sender company="Microsoft" />
非法的 XML:
<sender company="W3Schools" />
如果您希望属性拥有固定的值,并不允许作者改变这个值,请使用 #FIXED 关键词。如果作者使用了不同的值,XML 解析器会返回错误。
- 列举属性值
<!ATTLIST element-name attribute-name (en1|en2|..) default-value>
<!ATTLIST payment type (check|cash) "cash">
XML 例子:
<payment type="check" />
或
<payment type="cash" />
如果您希望属性值为一系列固定的合法值之一,请使用列举属性值。
3. dtd声明类型
3.1 内部声明
xml内容和dtd在同一个xml文件内.
声明位置: <?xml version="1.0"?>
之后, 元素之前
声明格式: <!DOCTYPE root-element [element-declarations]>
作用范围: 当前xml范围内
声明示例:
<?xml version="1.0"?>
<!DOCTYPE note [
<!ELEMENT note (to,from,heading,body)>
<!ELEMENT to (#PCDATA)>
<!ELEMENT from (#PCDATA)>
<!ELEMENT heading (#PCDATA)>
<!ELEMENT body (#PCDATA)>
]>
<note>
<to>Tove</to>
<from>Jani</from>
<heading>Reminder</heading>
<body>Don't forget me this weekend</body>
</note>
以上 DTD 解释如下:
- !DOCTYPE note (第二行)定义此文档是 note 类型的文档
- !ELEMENT note (第三行)定义 note 元素有四个元素:“to、from、heading,、body”
- !ELEMENT to (第四行)定义 to 元素为 “#PCDATA” 类型
- !ELEMENT from (第五行)定义 from 元素为 “#PCDATA” 类型
- !ELEMENT heading (第六行)定义 heading 元素为 “#PCDATA” 类型
- !ELEMENT body (第七行)定义 body 元素为 “#PCDATA” 类型
3.2 外部SYSTEM声明
一般项目内声明的dtd约束, 项目内可以复用
格式: <!DOCTYPE root-element SYSTEM "dtdFileName">
注意: dtdFileName可以是xml的相对路径或文件绝对路径
outer.xml文件内容:
<?xml version="1.0"?>
<!DOCTYPE note SYSTEM "my.dtd">
<note>
<to>Tove</to>
<from>Jani</from>
<heading>Reminder</heading>
<body>Don't forget me this weekend!</body>
</note>
my.dtd文件内容(和outer.xml同一级目录下):
<!ELEMENT note (to,from,heading,body)>
<!ELEMENT to (#PCDATA)>
<!ELEMENT from (#PCDATA)>
<!ELEMENT heading (#PCDATA)>
<!ELEMENT body (#PCDATA)>
3.3 外部PUBLIC声明
第三方公共的dtd约束
声明格式: <!DOCTYPE 根元素名 PUBLIC "DTD的名称" "外部DTD文件的URI">
示例:
web.xml内容
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE web-app PUBLIC
"-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN"
"http://java.sun.com/dtd/web-app_2_3.dtd" >
<web-app>
</web-app>