(五)DTD验证XML文档
一、什么是DTD 文档类型定义(DTD:Document Type Definition)可定义合法的XML文档构建模块。它使用一系列合法的元素来定义文档的结构。
二、DTD的作用 1、有了DTD,每个XML可以携带一个自身格式的描述。 2、有了DTD,不同组织可以使用一个通用的DTD来交换数据。 3、应用程序中使用DTD校检从外部接受的XML数据是否有效。
三、DTD中包含的内容 1、元素的定义规则:在DTD中需要验证XML中能包含哪些元素。 2、元素之间的关系规则:指元素的父元素是谁,元素和元素之间到底是上下层关系还是平行关系。 3、属性的定义:可以规定在XML中属性名是什么,属性值是什么类型。 ? 四、DTD的分类: 1、内部DTD文档:DTD文档和XML文档在同一个文件中。 <!DOCTYPE 根元素 [定义内容]> 2、外部DTD文档:DTD文档和XML文档保存在不同文件中。 <!DOCTYPE 根元素 SYSTEM "DTD文件路径"> 3、内外结合的DTD文档:两种相结合的写法。 <!DOCTYPE 根元素 SYSTEM "DTD文件路径" [定义内容]> ? 五、DTD元素定义 语法: <!ELEMENT NAME CONTENT> ELEMENT:关键字,表示声明一个DTD文档。 NAME:元素名称,XML中元素的名称。 CONTENT:元素类型, 元素类型包括:EMPTY、#PCDATA、纯元素类型、ANY。 1、Empty: 该元素不能包含子元素和文本,但可以有属性(空元素)。 语法: <!ELEMENT 元素名称 EMPTY> 例:声明一个空的student元素 <!ELEMENT student empty> XML示例: <student />
2、#PCDATA: 可以包含任何字符数据,但不能包含其他子元素。只有 PCDATA 的元素通过圆括号中的 #PCDATA 进行声明: 语法: <!ELEMENT 元素名称 (#PCDATA)> 例:声明一个name的元素 <!ELEMENT name (#PCDATA)> XML示例: <name>张三</name> ? 3、纯元素类型: 只能包含子元素,不能包含文本。元素出现的顺序必须和定义一致。 语法: <!ELEMENT 元素名称 (子元素名称 1,子元素名称 2,.....)> 例:声明学生标记 <!ELEMENT student(name,age)> XML示例: <student> <name>张三</name> <age>18</age> </student>
可以包含任何元素类型。 语法: <!ELEMENT 元素名称 ANY> ? 例: <?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE studentlist [ <!--声明根元素下可以包含多个student元素--> <!ELEMENT studentlist (student*)> <!--声明student下可以包含name,age,sex元素,name必须出现0-1次, age出现0-多次,sex必须出现1次 --> <!ELEMENT student (name?,age*,sex)> <!--声明name中只能包含文本,不能包含其他标记--> <!ELEMENT name (#PCDATA)> <!ELEMENT age (#PCDATA)> <!--声明sex为空元素--> <!ELEMENT sex EMPTY> ]> <studentlist> <student> <name>张三</name> <age>20</age> <sex/> </student> <student> <name>李四</name> <sex/> </student> </studentlist> ? ? 六、DTD中属性的定义 语法: <!ATTLIST 元素名称 属性名称 属性类型 默认值> 说明: ATTLIST:属性列表关键字。 元素名称:要修饰的元素名称。 属性名称:元素谁能够的名称。 属性类型:CDATA、ID、IDREF/IDREFS、Enumerated。 属性特点:#REQUIRED、#IMPLIED、#FIXED value、Default value。 1)#REQUIRED:表示元素属性都必须有该属性的值,不能为空。 2)#IMPLIED:表示元素属性可以忽略的值,可以为空。 3)#FIXED value:表示元素属性必须为指定的固定值,固定值在value中指定。 4)Default value:表示给指定元素默认值,不需要使用Default,直接指定默认值即可。 ? 属性类型: 1、CDATA属性 表示属性值可以是任何字符,包括数字和中文。 示例:声明student属性name值为任何文本,必须有值 DTD示例: <!ATTLIST student name CDATA #REQUIRED>? XML示例: <student name="zhangsan" /> ? 2、ID属性 表示属性取值必须是唯一的 示例1:对studentid属性设置为唯一值。并且必须有值。 DTD示例: <!ATTLIST student id ID #REQUIRED>? XML示例: <student id="10086" /> ? 示例2:同时对多个属性设置属性,对student的id DTD示例: <!ELEMENT student (id,name)> <!ATTLIST student id ID #REQUIRED name CDATA #REQUIRED> XML示例: <student id="10086" name="zhangsan"></student> ? 3、IDREF/IDREFS IDREF:表示该属性的值指向其他地方声明的ID类型的值。 IDREFS:同IDREF,但是可以由空格分开多个引用。 示例: <?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE categories [ <!ELEMENT categories (category*)> <!ELEMENT category (category*)> <!ATTLIST category id ID #REQUIRED name CDATA #REQUIRED parentid IDREF #IMPLIED> <!--子类中的parentid引用外层的id--> ]> <categories> <category id="c_1" name="电器"> <category id="c_10" parentid="c_1" name="电视"/> <category id="c_11" parentid="c_1" name="冰箱"/> <category id="c_12" parentid="c_1" name="冰箱"/> </category> <category id="c_2" name="手机"> <category id="c_20" parentid="c_2" name="智能手机"/> <category id="c_21" parentid="c_2" name="非智能手机"/> </category> </categories> ? 4、Enumerated 枚举,预定义一些值,属性的值必须在所列出的值得范围类。 DTD示例:学生性别只能是男或者女 <!ATTLIST student?sex (男|女) #REQUIRED> XML示例: <student sex="男"> ? 七、实体 在DTD中定义的常量,在XML中使用。用于定义在XML中多次出现的值。 实体可以分为内部实体和外部实体: 1、内部实体 语法: <!ENTITY 实体名 "实体值"> 示例:定义 DTD示例: <!ENTITY writer "Bill Gates"> XML示例: <author>&writer;©right;</author> 注意:一个实体由三部分构成: 一个和号 (&),一个实体名称,以及一个分号 (;)。 ? 2、外部实体 语法: <!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;©right;</author> (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |