XML与DTD
发布时间:2020-12-16 02:04:56 所属栏目:百科 来源:网络整理
导读:DTD简介 DTD(Document Type Definition,文档类型定义)的作用是定义XML文档的合法构建模块。DTD使用一系列的合法构成成员来定义文档结构。 DTD构成 DTD可以在XML文档中直接写入,也可以单独形成文档。因此,DTD分为外部DTD和内部DTD两种。外部DTD就是已经
DTD简介DTD(Document Type Definition,文档类型定义)的作用是定义XML文档的合法构建模块。DTD使用一系列的合法构成成员来定义文档结构。 DTD构成DTD可以在XML文档中直接写入,也可以单独形成文档。因此,DTD分为外部DTD和内部DTD两种。外部DTD就是已经编辑好的可以被不同的XML文档共享和调用的DTD,内部DTD就是在XML文档中直接设定DTD。 文档类型声明以<!DOCTYPE 为开始,以 ]> 结束。通常将开始和结束放在不同的行上,文档类型定义的内部子集(即内部DTD)的语法格式为:
<!DOCTYPE 根元素名称[ <!ELEMENT 子元素名称 (#PCDATA)> ]>
例:编写一个包含两个员工信息的简单XML文件,接着定义相应的DTD文件,并在XML中添加引用
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE 员工[ <!ELEMENT 员工 (李亮,张合) > <!ELEMENT 李亮 (性别,出生日期) > <!ELEMENT 张合 (性别,出生日期) > <!ELEMENT 性别 (#PCDATA) > <!ELEMENT 出生日期 (#PCDATA) > ]> <员工> <李亮> <性别>男</性别> <出生日期>1993.1.1</出生日期> </李亮> <张合> <性别>男</性别> <出生日期>1992.1.1</出生日期> </张合> </员工> 元素声明元素是XML文档的核心部分,声明的语法格式如下:<!ELEMENT 元素名 EMPTY/(子元素内容)/(混合内容)/ANY/#PCDATA >
元素声明分类
常见的元素类型有五种,但元素声明的种类不止五种,具体分类如下:
空元素使用EMPTY来定义,改元素只能有属性而不会有字符数据或子元素,语法如下:
<!ELEMENT 元素名 EMPTY>例如:<!ELEMENT 员工 EMPTY>
PCDATA类型的元素不包含其他任何元素,只包含字符数据(即文本数据)的元素,语法如下:
<!ELEMENT 元素名 (#PCDATA)>
包含任何内容的元素声明类型为ANY,可以包含任何可解析数据的组合,如DTD中定义的其他任何元素或已编译的字符数据,包括PCDATA、元素或元素和PCDATA的混合内容,语法如下:
<!ELEMENT 元素名 ANY>
父元素声明用于指定某个元素可以包含哪些子元素以及出现次序,语法如下:
<!ELEMENT 元素名 (子元素列表)>根据子元素间的关系,子元素内容模型可以有两种可能的结构:序列和选择。
(1)序列
序列结构用于描述根元素下,必须要出现的子元素,如下所示:
<!ELEMENT 员工 (姓名,性别)>(2)选择
选择结构定义了根元素下的可选元素。如下所示:
<!ELEMENT 出行 (步行|公交)>该声明表示根元素出行必须包含子元素公交或子元素步行,但不能同事包含两个。
元素指示符
元素的频率即出现的次数使用加号“+”、星号“*”、问号“?”来指定,其表示如下:
<!ELEMENT 元素名称 (子元素名称)>
<!ELEMENT 元素名称 (子元素名称+)>
<!ELEMENT 元素名称 (子元素名称*)>
<!ELEMENT 元素名称 (子元素名称?)>
<!ELEMENT note (#PCDATA|to|from|hrader|message)*> 属性<!ATTLIST 元素名 属性名 属性类型 属性限定条件>
属性附加声明:
例如:声明指定name元素具有id属性,该属性的类型为CDATA,每个name实例元素必须具有id属性
<!ATTLIST name id CDATA #REQUIRED> DTD引用引用内部DTD
前面介绍,均使用内部DTD
引用外部DTD
使用外部DTD时,要在DOCTYPE中使用SYSTEM或PUBLIC关键字,来指定外部DTD位置。
除了使用
SYSTEM和PUBLIC指定外部DTD的位置以外,XML中需要以standalone="no"来表示该文档引用的是外部DTD
例如:定义一个DTD文件和XML文件,来描述水果和季节的信息
(1)定义DTD文件xmldtd.dtd
<?xml version="1.0" encoding="UTF-8"?> <!ELEMENT 水果与季节 (季节+,水果+) > <!ELEMENT 季节 (#PCDATA) > <!ATTLIST 季节 id ID #REQUIRED > <!ATTLIST 季节 名称 CDATA #REQUIRED > <!ELEMENT 水果 (#PCDATA) > <!ATTLIST 水果 f_id IDREF #REQUIRED > <!ATTLIST 水果 名称 CDATA #REQUIRED >(2 )定义对应的XML文件标记,并引用上述DTD文件 <?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE 水果与季节 SYSTEM "xmldtd.dtd"> <水果与季节> <季节 id="f1" 名称="春天"></季节> <季节 id="f2" 名称="夏天"></季节> <水果 f_id="f1" 名称="草莓"></水果> <水果 f_id="f2" 名称="西瓜"></水果> </水果与季节> 混合引用DTD
如果XML文件同时带有内部DTD和外部DTD文件,那么XML解析器会将二者合一。语法如下
<!DOCTYPE 根标记名 SYSTEM "URI" [ 内部DTD内容 ]>或 <!DOCTYPE 根标记名 PUBLIC FPI "URI" [ 内部DTD内容 ]>将上述实例保持DTD不变,修改其XML文件,同时使用内部和外部DTD,增加水果元素的属性: <?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE 水果与季节 SYSTEM "xmldtd.dtd" [ <!ATTLIST 水果 性味 CDATA #REQUIRED> ]> <水果与季节> <季节 id="f1" 名称="春天"></季节> <季节 id="f2" 名称="夏天"></季节> <水果 f_id="f1" 名称="草莓" 性味="性凉"></水果> <水果 f_id="f2" 名称="西瓜" 性味="性寒"></水果> </水果与季节> 实体声明与引用普通实体
实体基本意思是指与XML文档相关的存储单元。根据实体内容与DTD的包含关系可以将实体分为内部实体和外部实体。
内部实体是实体的内容已经包含在DTD文件本身中,如下所示:
<!ENTITY hello "How are you,& 你好">
该实体的内容是“How are you,& 你好”。
外部实体的内容是通过URI引进DTD以外的其他文件。如下所示:
<!ENTITY img SYSTEM "temp.jpg">或 <!ENTITY img PUBLIC "-//ISO9//ME/IMG/EN" "temp.jpg">
若想引用上述实体,则如 &hello; 与&img;
对于public格式,语法如下:
<!ENTITY name PUBLIC FPI "URI">
FPI的格式为:
"前缀//使用者标识//文本类/文本描述/所用语言"
FPI的详细介绍如下:
参数实体
使用参数实体的DTD是放到一个单独的文件中,是因为在XML内部DTD中,参数实体引用不能在标记声明内部出现。语法如下:
<!ENTITY % name PUBLIC FPI "URI">
例如:
<?xml version="1.0" encoding="UTF-8"?> <!ENTITY % 介绍 "(生产日期,库存量)"> <!ELEMENT PC机 %介绍;> <!ELEMENT 生产日期 (#PCDATA)> <!ELEMENT 库存量 (#PCDATA)> (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |