[Web/基础/DTD]XML-DTD的简要总结

XML-DTD的简要总结

声明
本文部分DTD实例取自W3C教程。
CSDN不支持DTD高亮,使用的XML高亮。

简介

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

它使用一系列的合法元素来定义文档结构。

包含内容

  • 引用方法
  • 元素
  • 属性
  • 实体
  • PCDATA
  • CDATA
  • 参数实体

DTD引用方法

// 内部声明
<!DOCTYPE 根元素 [元素声明]>
// 外部声明(本地和公共计算机)
<!ENTITY 实体名称 SYSTEM "URI/URL">					// 本地计算机
<!ENTITY 实体名称 PUBLIC "publicID" "URI">			// 公共计算机

元素

采用ELEMENT标签对元素进行声明。元素可以包含文本(PCDATA)子元素为空(EMPTY)

元素声明的格式
类别1:<!ELEMENT 元素名称 类别关键字>
或
类别2:<!ELEMENT 元素名称 (元素内容)>		// 元素的内容可以是文本或元素
空元素

空元素属于类别1,EMPTY属于类型关键字。

<!ELEMENT 元素名称 EMPTY>
<!ELEMENT br EMPTY>
// 对应了HTML当中的<br />标签
任意内容的元素

属于类别1,ANY属于类别关键字。

<!ELEMENT 元素名称 ANY>
<!ELEMENT note ANY>
只包含PCDATA元素

属于类别2,完整的PCDATA标签对应位置为元素内容,标签对当中可包含文本。

【内容】

<!ELEMENT 元素名称 (#PCDATA)>
<!ELEMENT from (#PCDATA)>
带有子元素(序列)的元素

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

<!ELEMENT 元素名称 (子元素名称 1)>
<!ELEMENT 元素名称 (子元素名称 1,子元素名称 2,.....)>

多个子元素由按照逗号分割开的序列进行声明。其子元素必须按照相同的顺序出现在文档当中。

完整声明当中,子元素也必须声明。

<!ELEMENT note (to,from,heading,body)>
<!ELEMENT to      (#PCDATA)>
<!ELEMENT from    (#PCDATA)>
<!ELEMENT heading (#PCDATA)>
<!ELEMENT body    (#PCDATA)>

下面按照子序列的形式进行细分,

声明只出现一次的元素
<!ELEMENT 元素名称 (子元素名称)>

按照此种方法声明后,该元素在文档中必须出现一次且只出现一次。

声明最少出现一次的元素
<!ELEMENT 元素名称 (子元素名称+)>

按照此种方法声明后,该元素在文档中至少出现一次。

声明出现零次或者多次的元素
<!ELEMENT 元素名称 (子元素名称*)>

按照此种方法声明的子元素,可以出现零次或多次。

出现零次或一次的元素
<!ELEMENT 元素名称 (子元素名称?)>

按照此种方法声明的子元素,可以出现零次或一次。

声明"非…/即…"

**(A|B)**即为此结构。

<!ELEMENT note (to,from,header,(message|body))>

分析:此元素必须包含的子元素有to,from,header,以及message|body当中一个。

声明混合型的内容
<!ELEMENT note (#PCDATA|to|from|header|message)*> 

可以出现多种类型的元素,且可以出现零次或多次。

属性

简介

属性可以提供有关元素的额外信息。

名称/值的形式成对出现。

声明属性方法
<!ATTLIST 元素名称 属性名称 属性类型 默认值>
属性类型表
类型描述
CDATA值为字符数据 (character data)
(en1|en2|…)此值是枚举列表中的一个值
ID值为唯一的 id
IDREF值为另外一个元素的 id
IDREFS值为其他 id 的列表
NMTOKEN值为合法的 XML 名称
NMTOKENS值为合法的 XML 名称的列表
ENTITY值是一个实体
ENTITIES值是一个实体列表
NOTATION此值是符号的名称
xml:值是一个预定义的 XML 值
默认值表
解释
属性的默认值
#REQUIRED属性值是必需的
#IMPLIED属性不是必需的
#FIXED value属性值是固定的
默认值

一般的使用方法

<!ELEMENT square EMPTY>
<!ATTLIST square width CDATA "0">

<square width="100" />			合法

“square” 被定义为带有 CDATA 类型的 “width” 属性的空元素。如果宽度没有被设定,其默认值为0。

#REQUIRED

<!ATTLIST 元素名称 属性名称 属性类型 #REQUIRED>
<Math num="1234" />				合法
<Math />						非法

#IMPLIED

<!ATTLIST 元素名称 属性名称 属性类型 #IMPLIED>
<Math num="1234" />			合法
<Math />					合法

#FIXED value

<!ATTLIST 元素名称 属性名称 属性类型 #FIXED "value">
<Company name="Microsoft" />			合法
<Company name="Google" />			非法
列举属性值

将属性值设定为固定的合法值之一。

<!ATTLIST 元素名称 属性名称 (en1|en2|..) 默认值>
<!ATTLIST payment type (check|cash) "cash">	

<payment type="check" />
<payment type="cash" />
多属性值的声明
<!ATTLIST Student
age CDATA #IMPLIED
name CDATA #IMPLIED
class CDATA #REQUIRED
credit CDATA #REQUIRED>

实体

简介

实体用于定义引用不同文本和特殊字符的快捷方式的变量。

实体是用来定义普通文本的变量,实体引用是实体的引用。

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

当文档被 XML 解析器解析时,实体就会被展开。

预定义实体

有一些预留字符涉及到了DTD结构中的关键字符,他的出现会影响实体的正常解析,且容易造成注入攻击,因此需要预定义。

实体引用字符
&lt;<
&gt;>
&amp;&
&quot;"
&apos;

要注意的是,

  • 转义字符内不包含空格
  • 区分大小写
内部实体声明
<!ENTITY 实体名称 "实体的值">
外部实体引用

外部实体可以支持多种协议,如HTTP、FILE等协议。如file://可以在本地读取有权限读取的任意文件。

<!ENTITY 实体名称 SYSTEM "URI/URL">					// 本地计算机
<!ENTITY 实体名称 PUBLIC "public_ID" "URI">			// 公共计算机
<!ENTITY writer SYSTEM "http://www.w3school.com.cn/dtd/entities.dtd">

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

<author>&writer;&copyright;</author>

参数实体

%file;(参数实体)是在DTD中被引用的,而&file;是在xml文档中被引用的。

仅在DTD文档当中使用的解析实体称为参数实体。

常用于针对DTD文档进行使用,方便我们容易的修改或维护DTD文档的结构,降低DTD文档的重复度。

用法

声明关键字和实体,在解析时对文本进行替换以产生作用。

// 一个参数实体的声明格式
<!ENTITY % 参数实体名称 替换文本>
<!ENTITY % peopleParameters "age CDATA #IMPLIED weight CDATA #IMPLIED height CDATA #REQUIRED">
// 使用案例,将想引入的 %参数实体名称; 按此格式进行引用,可在解析式完成文本替换。
<!ATTLIST InsuredPerson %peopleParameters; carrier CDATA #REQUIRED >、
// 其替换结果等效于
<!ATTLIST InsuredPerson
age CDATA #IMPLIED
weight CDATA #IMPLIED
height CDATA #REQUIRED
carrier CDATA #REQUIRED>
重要说明

与一般实体类似,参数实体的置换文本也可位于外部文件中。

此类声明中进行替换的替换形式只能用于DTD外部子集

在内部子集中,参数实体引用只能位于其他声明当中:此类实体引用的值需要符合语法,否则将影响DTD格式的正规性

两种重要的文本形式

PCDATA

PCDATA 的意思是被解析的字符数据(parsed character data)。

可把字符数据想象为 XML 元素的开始标签与结束标签之间的文本。

PCDATA 是会被解析器解析的文本。这些文本将被解析器检查实体以及标记。

文本中的标签会被当作标记来处理,而实体会被展开。

不过,被解析的字符数据不应当包含任何 &、< 或者 > 字符;需要使用 &、< 以及 > 实体来分别替换它们。

CDATA

CDATA 的意思是字符数据(character data)。

*CDATA 是不会被解析器解析的文本。*在这些文本中的标签不会被当作标记来对待,其中的实体也不会被展开。

我们知道,在使用中,出现XML的预留字符(指&、<、>、"、’)时,需要使用转义字符进行替换。

除了这种方法之外,我们还可以采用CDATA来包含包含这些字符的文字段,以避免解析造成的错误。

其相对于转义字符存在优势

  • 可读性强
  • 解析速度快

特别的

  • ]]>不可包含空格
  • ]]>作为CDATA标签的保留字符串,不可在标签内部出现。
    数据不应当包含任何 &、< 或者 > 字符;需要使用 &、< 以及 > 实体来分别替换它们。
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值