它定义了一个带有合法的元素和属性的列表的文档结构。
一个 DTD 可以被声明在 XML 文档内部(内联), 或者作为一个外部引用。
内部声明
如果 DTD 声明在 XML 文件内部, 必须被包装进 DOCTYPE 定义, 用以下的语法:
- <!DOCTYPE root-element [element-declarations]>
例如:
- <?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>
说明:
!DOCTYPE note 定义文档的根元素是 note
!ELEMENT note 定义了 note 元素包含 4 元素 to, from, heading, body
!ELEMENT to 定义 to 元素的类型是 #PCDATA
!ELEMENT from 定义 from 元素的类型是 #PCDATA
!ELEMENT heading 定义 heading 元素的类型是 #PCDATA
!ELEMENT body 定义 body 元素的类型是 #PCDATA
外部声明
如果 DTD 被声明为一个外部文件, 必须用以下的语法包装进 DOCTYPE 定义:
- <!DOCTYPE root-element SYSTEM "filename">
- <?xml version="1.0"?>
- <!DOCTYPE note SYSTEM "note.dtd">
- <note>
- <to>Tove</to>
- <from>Jani</from>
- <heading>Reminder</heading>
- <body>Don't forget me this weekend!</body>
- </note>
- <!ELEMENT note (to,from,heading,body)>
- <!ELEMENT to (#PCDATA)>
- <!ELEMENT from (#PCDATA)>
- <!ELEMENT heading (#PCDATA)>
- <!ELEMENT body (#PCDATA)>
为什么使用 DTD ?
使用 DTD, 每个 XML 可以带有自己格式的描述。
使用 DTD, 依赖于组的人们可以同意使用一个标准 DTD 说明数据。
你的应用程序使用 DTD 验证你从外部世界收到的数据是有效的。
你可以使用 DTD 验证自己的数据。
XML 文档的主要组成
Elements 元素
Attributes 属性
Entities 实体
PCDATA 解析字符数据
CDATA 字符数据
Element(元素)
XML 文档的主要部分。 元素可以包含文本, 其他元素, 或者是空的。
Attribute(属性)
提供元素的额外信息。 属性在开始标签的内部, 是“名=值”对的形式。
Entity(实体)
一些字符在 XML 文档中有特殊的含义, 比如小于号(<)定义标签的开始。
XML 中预定义的实体:
| Entity References | Character |
|---|---|
| < | < |
| > | > |
| & | & |
| " | " |
| ' | ' |
PCDATA 意为解析字符数据。
把字符数据看作 XML 元素开始标记和结束标记之间可以找到的文本。
PCDATA 是将要被一个解析器解析的文本。 这个文本要被解析器检查为实体和标记。
标签中的文本将要作为标记和实体被处理。
但是被解析的数据不能包含任何 &, <, > 字符, 这些需要被表现为 & < 和 > 实体。
CDATA 意为字符数据
CDATA 是不被解析器解析的文本。 标签中的文本将不被作为标记和实体处理。
声明 Element(元素)
在 DTD 中, XML 元素的声明语法:
- <!ELEMENT element-name category>
- <!ELEMENT element-name (element-content)>
空元素
- <!ELEMENT element-name EMPTY>
- <!ELEMENT br EMPTY>
- <br />
PCDATA
- <!ELEMENT element-name (#PCDATA)>
- <!ELEMENT from (#PCDATA)>
任何内容
- <!ELEMENT element-name ANY>
- <!ELEMENT note ANY>
子元素(子元素声明顺序要一致)
- <!ELEMENT element-name (child1)>
- <!ELEMENT element-name (child1,child2,...)>
- <!ELEMENT note (to,from,heading,body)>
只能出现一次的元素
- <!ELEMENT element-name (child-name)>
- <!ELEMENT note (message)>
至少出现一次的元素
- <!ELEMENT element-name (child-name+)>
- <!ELEMENT note (message+)>
出现 0 或者多次的元素
- <!ELEMENT element-name (child-name*)>
- <!ELEMENT note (message*)>
出现 0 或者 1 次的元素
- <!ELEMENT element-name (child-name?)>
- <!ELEMENT note (message?)>
声明任选一的元素
- <!ELEMENT note (to,from,header,(message|body))>
声明混合元素
- <!ELEMENT note (#PCDATA|to|from|header|message)*>
DTD 属性
- <!ATTLIST element-name attribute-name attribute-type default-value>
- <!ATTLIST payment type CDATA "check">
- <payment type="check" />
属性类型
| Type | Description |
|---|---|
|
CDATA |
The value is character data |
|
(en1|en2|..) |
The value must be one from an enumerated list |
|
ID |
The value is a unique id |
|
IDREF |
The value is the id of another element |
|
IDREFS |
The value is a list of other ids |
|
NMTOKEN |
The value is a valid XML name |
|
NMTOKENS |
The value is a list of valid XML names |
|
ENTITY |
The value is an entity |
|
ENTITIES |
The value is a list of entities |
|
NOTATION |
The value is a name of a notation |
|
xml: |
The value is a predefined xml value |
默认值
| Value | Explanation |
|---|---|
|
value |
The default value of the attribute |
|
#REQUIRED |
The attribute is required |
|
#IMPLIED |
The attribute is not required |
|
#FIXED value |
The attribute value is fixed |
DTD:
- <!ELEMENT square EMPTY>
- <!ATTLIST square width CDATA "0">
- <square width="100" />
#REQUIRED(必须) 属性值是必须的
语法:
- <!ATTLIST element-name attribute_name attribute-type #REQUIRED>
DTD:
- <!ATTLIST person number CDATA #REQUIRED>
- <person number="5677" />
- <person />
#IMPLIED(隐含) 属性值可有可无, 没有默认操作
语法:
- <!ATTLIST element-name attribute-name attribute-type #IMPLIED>
DTD:
- <!ATTLIST contact fax CDATA #IMPLIED>
- <contact fax="555-667788" />
- <contact />
#FIXED(固定) 属性值是固定的, 不允许改变
语法:
- <!ATTLIST element-name attribute-name attribute-type #FIXED "value">
DTD:
- <!ATTLIST sender company CDATA #FIXED "Microsoft">
- <sender company="Microsoft" />
- <sender company="W3Schools" />
枚举属性值
语法:
- <!ATTLIST element-name attribute-name (en1|en2|..) default-value>
DTD:
- <!ATTLIST payment type (check|cash) "cash">
- <payment type="check" />
- <payment type="cash" />
在 XML 中, 什么时候用属性, 什么时候用子元素, 没有一个固定的规则。 (尽量用子元素表现数据)
数据可以被存贮为属性或者子元素。
例如:
- <person sex="female">
- <firstname>Anna</firstname>
- <lastname>Smith</lastname>
- </person>
- <person>
- <sex>female</sex>
- <firstname>Anna</firstname>
- <lastname>Smith</lastname>
- </person>
声明实体(注意: 实体包含 3 部分 &符号, 实体名称, 分号)
内部定义语法:
- <!ENTITY entity-name "entity-value">
DTD Example:
- <!ENTITY writer "Donald Duck.">
- <!ENTITY copyright "Copyright W3Schools.">
- <author>&writer;©right;</author>
外部定义语法:
- <!ENTITY entity-name SYSTEM "URI/URL">
- <!ENTITY writer SYSTEM "http://www.w3schools.com/entities.dtd">
- <!ENTITY copyright SYSTEM "http://www.w3schools.com/entities.dtd">
- <author>&writer;©right;</author>
1647

被折叠的 条评论
为什么被折叠?



