DTD基本语法

DTD基本语法

指定与 XML 数据相关的DTD规则

XML中使用的与DTD相关联的“文档类型声明”写在XML声明之后

内部DTD规则

DTD 规则本身出现在目标 XML 文档中,这些规则仅应用于当前 XML 文档

指定内部DTD规则的语法
<?xml version="1.0" standalone="yes"?>

< !DOCTYPE root_element [

]>
注:!DOCTYPE用于声明DTD文档
< !–root_element指的是xml文档的根元素-- >

例如:

<?xml version="1.0" standalone="yes"?>

< !–内部DTD规则,定义在xml文档里的规则-- >

< !DOCTYPE student [

< !–此处进行元素以及属性的声明,注意根元素也需要声明-- >

]>
< !–xml文档的内容-- >
< student >


< /student >

外部DTD规则

作为一个单独的 DTD 文件关联于目标 XML 文档,这些规则可应用于多个XML 文档

指定外部DTD规则的语法
私有的外部 DTD 文件

这种外部 DTD 文件仅由某个开发人员、或者同属于某个小组的开发人员使用,其内容并不向外界公开

< !DOCTYPE root_element SYSTEM “DTD_location”>
注:STYSTEM用于声明私有的外部DTD文件
< !–DTD_location 表示获得这个 DTD 文件所需的相对的、或绝对的 URL-- >

例如:

<?xml version="1.0" standalone="no"?>

< !–外部DTD文档定义于xml文档外,在使用时在xml文档内进行声明即可-- >

< !DOCTYPE book SYSTEM “book.dtd”>
< !–xml文档的内容-- >
< book >
……
< /book >

公开的外部 DTD 文件

这种 DTD 文件由权威机构制订的、提供给特定行业或公众使用的 DTD,甚至可能通过了国际标准化组织的批准,以便数据的提供者和使用者对所交互的数据进行有效性验证

< !DOCTYPE root_element PUBLIC “DTD_name” “DTD_location”>
注:PUBLIC用于声明公开的外部DTD文件
< !–如果解析器无法根据DTD_name找到相应的DTD文件,将进一步根据DTD_location所指示的位置进行查找-- >

DTD_name的语法

“prefix//owner_of_the_DTD//description_of_the_DTD//language_identifier”

//是不可缺少的

组成作用
prefix是否通过批准,是否是ISO标准
owner_of_the_DTD发布文档的机构
description_of_the_DTD对文档的简短描述
Language_identifier语言版本
prefix表示
ISO通过批准的ISO标准
+通过标准的非ISO标准
-未通过批准的非ISO标准

内外部DTD规则的组合使用

语法

< !DOCTYPE root-element SYSTEM “URI”[

]>

条件DTD

使用IGNORE和INCLUDE关键字来忽略或包含相应的DTD规则

语法
<!IGNORE [ 忽略的规则 ]]> <!INCLUDE [ 包含的规则 ]]>

如果直接使用上述语法,则忽略或包含的DTD规则并不能提供任何价值
因此,需要配合参数实体

注意:最后是两个]

条件DTD块在外部使用,把选择权交给XML文档

将实体定义为忽视,故可以在内部DTD重新定义外部DTD中被忽视的内容

参数实体作为条件DTD块的开关
IGNORE的优先级比INCLUDE高

元素

dtd元素的声明和元素属性的声明是分离的

DTD文件中元素的作用与书写位置无关
DTD文件中不允许使用多个元素约束同一个标记(用于限定xml时会出现歧义)

元素声明

语法
<!ELEMENT element-name category> <!ELEMENT element-name (element-content)>

!ELEMENT 声明元素

元素的名称 element-name

指定元素的类别或者元素的内容模型

各部分之间的空格不可缺省

空元素
声明语法
<!ELEMENT element-name EMPTY>

表示元素的内容为空,不包含子元素或者文本

包含任意内容的元素
声明语法
<!ELEMENT element-name ANY>

表示元素中可以包含任何内容(没有具体的限制

只包含文本内容的元素
声明语法
<!ELEMENT element-name (#PCDATA)>

表示元素中只包含文本内容,不能包含子元素,也可以是空标记

只包含子元素的元素
语法声明
<!ELEMENT element-name (child1,child2,...)>

(child1,child2,…) 表示一个序列,即内容模型

内容模型中各符号的意义
符号含义
,分隔序列中的每一项,严格按照顺序出现
|可从前后参数中任选一项
()括号中的内容是一个组
?出现0次或1次
+出现次数大于等于1
*出现次数大于等于0

由于xml中子元素的顺序是有意义的,所以需要,来规定元素的出现顺序,未加次数限制,则必须出现且仅可出现一次

包含指定的子元素以及文本内容的元素
声明语法
<!ELEMENT element-name (#PCDATA | child1 | child2 | ...)*>

表示元素中可以包含文本内容,以及子元素的任意组合(任意个数、任意顺序),甚至什么都不包括

必须将 #PCDATA 放在最前面,必须用*号结尾,必须用“|”分隔。

局限性:

  1. 只可约束子表记的类型,而不可约束其出现的次数及顺序

  2. 约束条件中不能出现限制符号

    例如:(#PCDATA|子标记+|子标记*)是错误的

元素属性的声明

语法
<!ATTLIST element-name attr-name attr-type attdesc>

声明多个属性的方法

  1. <!ATTLIST element-name attr1 attr-type1 attdesc1 attr2 attr-type2 attdesc2>
  2. <!ATTLIST element-name attr1 attr-type1 attdesc1> <!ATTLIST element-name attr2 attr-type2 attdesc2>
属性类型(attr-type)
类型描述
CDATA字符数据“Character data",可以是任意字符串,但是不能含有 " < & ,若需则用实体表示
(value1|value2|…) value1value2 等构成的一个枚举类型,属性值必取其中之一
NMTOKEN全称Name Token——指定该属性值是字符串数据,但比CDATA具有更强的约束,即属性值只能由字母、数字、下划线**_、中划线-、点号( . )和冒号( : )** 以及数值实体(unicode)组成(与xml命名规范相同)
NMTOKENS空格隔开的多个 NMTOKEN
ID表示属性的值在文档中是唯一的,可以由字母、数字、下划线_、中划线-、点号(.)组成,但必须以字母或下划线开头
IDREF表示属性的值引用另一个属性的 ID
IDREFS空格隔开的多个 ID
ENTITY表示属性的值是一个实体
ENTITIES空格隔开的多个 ENTITY
NOTATION表示属性值是在dtd声明了的未解析实体的类型
属性的描述(attdesc)
属性描述含义
value(字符串)表明元素的该属性的缺省值为value
#REQUIRED表明元素的该属性是必须的,没有默认值
#IMPLIED表明元素的该属性是可选的,没有默认值
#FIXED value表明元素的该属性值为固定值 value

ID 类型属性的默认情况只能是 #REQUIRED 和 “IMPLIED”无默认值
一个标记的若干属性中,不允许有两个属性的类型都是ID,ID是唯一的

实体

是内容的占位符,实体可以包含单个字符、字符串文本、甚至 XML 片段,只需要进行一次声明,就可以在文档中相应的地方多次使用

使用实体的目的:为了使得 XML 文档更容易编写、维护和阅读

根据占位符出现的位置不同,可以将实体分为两大类

参数实体

用于在DTD规则中进行占位,参数实体不包含XML文本,也不出现在XML文档的数据中,只在DTD中使用

内部参数实体

参数实体的声明和引用出现在相同的 DTD 中

声明语法

<!ENTITY % entity-name “entity_value">

%与实体名之间用空格隔开

entity_value是entity-name代替的值

引用格式

%entity-name;

%与实体名之间无空格,引用语句后有分号;

外部参数实体

相当于将一个外部的文件导入到 DTD 中

声明语法

<!ENTITY % entity-name SYSTEM "URI">

<!ENTITY % entity-name PUBLIC "public_ID" "URI">

一般实体

用于在XML数据中进行占位,但是是在DTD文档中定义的

字符内容实体

包括内部字符内容实体和外部字符内容实体

命名实体

声明语法

<!ENTITY entity-name "entity_value">

<!ENTITY entity-name SYSTEM "URI">

entity_value 中不能包含XML标记(<、>、”、&),转义内容可以存在,并且将会对实体进行扩展

SYSTEM用于声明外部一般实体,否则为内部一般实体

引用语法

&entity-name;

预定义实体

在 XML 文档的文本内容和被解析器解析的字符数据中,都不能直接出现 <、>、”、’、&,必须使用对应的预定义实体(无需专门定义,可以直接使用)

字符预定义实体(解析之后将被还原)
<& lt;(less than)
>& gt;(great than)
&& amp;
& apos;
"& quot;

注意&与字符之间无空格

数值实体

不需要进行定义,可以直接引用,使用数值来表示相应的内容,数值是字符所对应的 Unicode 代码

例如:

解析为:< title >学习XML< /title >

< !–点击即可查看源码即Unicode码-- >

< !–Browser视图,用浏览器的内置XML解析器解析后得到的XML文档树-- >

只能得到文档树

未解析实体

可在 XML 数据中指明关联二进制文件(图片、音频、视频等),由解析器通过调用对应的应用程序对这些文件进行解析,解析器本身无法处理这些非 XML 的数据

<!NOTATION gif SYSTEM "gif-viewer.exe">

< !–定义未解析的实体的类型-- >
< !–此类型是由某个应用软件解读二进制图片文件-- >

<!ENTITY logo SYSTEM "logo.gif" NDATA gif>

NDATA gif表明其为未解析的数据,对应于NOTATION的声明gif

DTD文档的保存

保存DTD文件时所选择的编码必须和它要约束的XML文件保持一致

XML解析器发现文档中指定的dtd后会按照xml中指定的编码方式去解析dtd

浏览器内置XML解析器的作用

浏览器内置的XML解析器只检查XML关联的DTD文件本身是否有错,但不检查XML文件是否遵守了DTD文件的约束条件

  • 2
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值