W3school 之 XML DTD 内容摘录

虽然DTD 将被schema取代,但目前在一些应用上还是有DTD来定义的XML,只为了解一点。

内容原址http://w3school.com.cn/

 

DTD(文档类型定义)的作用是定义 XML 文档的合法构建模块。

它使用一系列的合法元素来定义文档结构。可被成行地声明于 XML 文档中,也可作为一个外部引用。

1.假如 DTD 被包含在您的 XML 源文件中,它应当通过下面的语法包装在一个 DOCTYPE 声明中:

<!DOCTYPE 根元素 [元素声明]>
如:
<?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>George</to>
  <from>John</from>
  <heading>Reminder</heading>
  <body>Don't forget the meeting!</body>
</note>

2.假如 DTD 位于 XML 源文件的外部,那么它应通过下面的语法被封装在一个 DOCTYPE 定义中:

<!DOCTYPE 根元素 SYSTEM "文件名">

//
在 DTD 中,XML 元素通过元素声明来进行声明。
1.元素声明使用下面的语法:

<!ELEMENT 元素名称 类别>
例:<!ELEMENT to CDATA>

或者是:<!ELEMENT 元素名称 (元素内容)>
例:<!ELEMENT note (to,from,heading,body)>

2.对于空元素则通过类别关键词EMPTY进行声明:

<!ELEMENT 元素名称 EMPTY>
例:<!ELEMENT note EMPTY>

3.对于只有 PCDATA 的元素则通过圆括号中的 #PCDATA 进行声明:

<!ELEMENT 元素名称 (#PCDATA)>
例:<!ELEMENT body (#PCDATA)>

4.通过类别关键词 ANY 声明的元素,可包含任何可解析数据的组合:

<!ELEMENT 元素名称 ANY>
例:<!ELEMENT body ANY>

5.带有一个或多个子元素的元素通过圆括号中的子元素名进行声明:

<!ELEMENT 元素名称 (子元素名称 1,子元素名称 2,.....)>
例:<!ELEMENT note (to,from,heading,body)>
当子元素按照由逗号分隔开的序列进行声明时,这些子元素必须按照相同的顺序出现在文档中。

6.声明只出现一次的元素。
<!ELEMENT 元素名称 (子元素名称)>
例:<!ELEMENT note (body)>
说明:子元素必须出现一次,并且必须只在 "note" 元素中出现一次。

7.声明最少出现一次的元素
<!ELEMENT 元素名称 (子元素名称+)>
例:<!ELEMENT note (body+)>
加号声明了:子元素必须在 "note" 元素内出现至少一次。
问:如果出现了多次怎么处理?

8.声明出现零次或多次的元素
<!ELEMENT 元素名称 (子元素名称*)>
例:<!ELEMENT note (body*)>
子元素 message 可在 "note" 元素内出现零次或多次。
问:如果出现了多次怎么处理?

9.声明出现零次或一次的元素
<!ELEMENT 元素名称 (子元素名称?)>
例:<!ELEMENT note (body?)>
问号声明了:子元素可在 "note" 元素内出现零次或一次。

10.声明“非.../既...”类型的内容
<!ELEMENT note (to,from,header,(message|body))>
上面的例子声明了:"note" 元素必须包含 "to" 元素、"from" 元素、"header" 元素,以及非 "message" 元素既 "body" 元素。

11.声明混合型的内容
<!ELEMENT note (#PCDATA|to|from|header|message)*>
上面的例子声明了:"note" 元素可包含出现零次或多次的 PCDATA、"to"、"from"、"header" 或者 "message"。

//

DTD属性声明使用下列语法:
<!ATTLIST 元素名称 属性名称 属性类型 默认值>

DTD 实例:
<!ATTLIST payment type CDATA "check">

XML 实例:
<payment type="check" />

属性类型:
已知的属性类型有11种。常用的有CDATA,(en1|en2|...),ID,ENTITY...等。

属性的默认值4种形式:
1.值 属性的默认值

DTD:
<!ELEMENT square EMPTY>
<!ATTLIST square width CDATA "0">
合法的 XML:
<square width="100" />
在上面的例子中,"square" 被定义为带有 CDATA 类型的 "width" 属性的空元素。如果宽度没有被设定,其默认值为0 。

2.#REQUIRED 属性值是必需的

<!ATTLIST 元素名称 属性名称 属性类型 #REQUIRED>
DTD:
<!ATTLIST person number CDATA #REQUIRED>
合法的 XML:
<person number="5677" />
非法的 XML:
<person />
假如您没有默认值选项,但是仍然希望强制作者提交属性的话,请使用关键词 #REQUIRED

3.#IMPLIED 属性不是必需的

<!ATTLIST 元素名称 属性名称 属性类型 #IMPLIED>
DTD:
<!ATTLIST contact fax CDATA #IMPLIED>
合法的 XML:
<contact fax="555-667788" />
合法的 XML:
<contact />
假如您不希望强制作者包含属性,并且您没有默认值选项的话,请使用关键词 #IMPLIED。

4.#FIXED value 属性值是固定的

<!ATTLIST 元素名称 属性名称 属性类型 #FIXED "value">
DTD:
<!ATTLIST sender company CDATA #FIXED "Microsoft">
合法的 XML:
<sender company="Microsoft" />
非法的 XML:
<sender company="W3School" />
如果您希望属性拥有固定的值,并不允许作者改变这个值,请使用 #FIXED 关键词。
如果作者使用了不同的值,XML 解析器会返回错误。

5.枚举值

<!ATTLIST 元素名称 属性名称 (en1|en2|..) 默认值>
DTD 例子:
<!ATTLIST payment type (check|cash) "cash">
XML 例子:
<payment type="check" />
或者
<payment type="cash" />
如果您希望属性值为一系列固定的合法值之一,请使用列举属性值。

6.多个属性的声明,如:

<!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>

DTD实体

实体是用于定义引用普通文本或特殊字符的快捷方式的变量。

实体引用是对实体的引用。

实体可在内部或外部进行声明。

实体内部声明:
语法:
<!ENTITY 实体名称 "实体的值">

DTD 例子:
<!ENTITY writer "Bill Gates">
<!ENTITY copyright "Copyright W3School.com.cn">
XML 例子:
<author>&writer;&copyright;</author>

注释: 一个实体由三部分构成: 一个和号 (&), 一个实体名称, 以及一个分号 (;)。

实体的外部声明:
<!ENTITY 实体名称 SYSTEM "URI/URL">

DTD 例子:
<!ENTITY writer SYSTEM "http://www.w3school.com.cn/dtd/entities.dtd">
<!ENTITY copyright SYSTEM "http://www.w3school.com.cn/dtd/entities.dtd">
XML 例子:
<author>&writer;&copyright;</author>

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值