学习下XML的约束模块DTD

    科技2024-07-22  65

    一、什么是DTD

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

    DTD 可被成行地声明于 XML 文档中,也可作为一个外部引用。 DTD的实例:

    <!DOCTYPE NEWSPAPER [ <!ELEMENT NEWSPAPER (ARTICLE+)> <!ELEMENT ARTICLE (HEADLINE,BYLINE,LEAD,BODY,NOTES)> <!ELEMENT HEADLINE (#PCDATA)> <!ELEMENT BYLINE (#PCDATA)> <!ELEMENT LEAD (#PCDATA)> <!ELEMENT BODY (#PCDATA)> <!ELEMENT NOTES (#PCDATA)> <!ATTLIST ARTICLE AUTHOR CDATA #REQUIRED> <!ATTLIST ARTICLE EDITOR CDATA #IMPLIED> <!ATTLIST ARTICLE DATE CDATA #IMPLIED> <!ATTLIST ARTICLE EDITION CDATA #IMPLIED> ]>

    以上为声明在XML文件中的一个DTD示例 简单来说,dtd可以约束你在XML文件中写的标签和属性等相关信息。

    二、DTD的三种引入方式

    (1)引入外部的dtd文件

    <!DOCTYPE 根元素的名称 SYSTEM “dtd文件路径”>

    (2)使用内部dtd,即将dtd内容直接写在XML文件中

    <!DOCTYPE 根元素的名称 [DTD文件中的内容]>

    (3)使用网络上的dtd文件

    <!DOCTYPE 根元素的名称 PUBLIC “DTD名称” “DTD文档的url”>

    上图是一个使用网络dtd文件的示例。

    三、使用dtd来定义元素

    (1)语法

    <!ELEMENT 元素名称 元素约束>

    (2)简单元素和复杂元素 简单元素:就是没有子元素的元素

    <!ELEMENT name (#PCDATA)>

    (#PCDATA)就代表一种约束,约束简单元素name标签内部只能放字符串,相似的还有EMPTY和ANY表示简单元素里面不放东西,为一个空标签或者里面可以放任意类型(可以为空,也可以放字符串) 复杂元素:有子元素的元素

    <!ELEMENT 元素名称 (子元素)>

    例如:

    <!ELEMENT person (name,age,school)>

    则代表person元素只有三个子元素name,age,school

    <person> <name>zhangsan</name> <age>20</name> <school>ZJU</school> </person>

    但是以上定义的子元素只能出现一次,但要是想出现多次,就需要用到一些特殊符号(这和正则匹配的规则有相似之处)

    + :表示一次或者多次 * :表示0次或者多次 ? :表示0次或者一次

    例如

    <!ELEMENT person (name+,age*,school?)>

    则代表person内子标签name至少得出现一次,age可以出现0次或者多次,school可以出现0次或者一次

    四、使用dtd来定义属性

    (1)语法

    <!ATTLIST 元素名称 属性名称 属性类型 属性约束 >

    (2)属性类型 有三种:

    CDATA:表示属性的取值为普通的字符串

    ENUMERATED:表示枚举,只能从枚举类型中任选其一

    ID:表示属性的取值不能重复,属性的值只能由字母、下划线开头,不能出现空白字符 (3)属性约束 有三种:

    #REQUIRED:表示该属性必须出现

    #IMPLIED:表示该属性可有可无

    #FIXED:表示该属性为一个固定值,语法:#FIXED “固定值”

    直接值:表示填写了该属性时为填写的属性值,没有填写为该默认值 定义属性示例:

    五、定义引用实体

    (1)语法:

    <!ENTITY 实体名称 “实体内容”>

    定义了实体之后,就可以在XML中使用

    &实体名称;

    XML中会自动用实体内容替代,这样可以简化代码

    Processed: 0.009, SQL: 8