XML文件约束DTD

文件约束

文件约束就是xml文档的书写规范,它约定了该文档的元素和属性应该怎么写,应该怎么嵌套
而DTD是文件约束的一种方式。常用的就如下两种,本文介绍DTD

  • XML DTD
  • XML Schema

DTD

DTD(document type definition 文档类型定义)常与xml文件配合,约束文件。

例如这样的myClass.dtd

<!ELEMENT 班级 (学生+)>
<!ELEMENT 学生 (名字,年龄,介绍)>
<!ELEMENT 名字 (#PCDATA)>
<!ELEMENT 年龄 (#PCDATA)>
<!ELEMENT 介绍 (#PCDATA)>

第一行表示根元素为班级,可以有一个或者多个子元素学生,+是正则表达式
第二行表示学生元素有三个子元素名字,年龄,介绍
#PCDATA表示名字里面可以放任意文本

那么xml文件会这样写

<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE 班级 SYSTEM "myClass.dtd">
<班级>
    <学生>
        <名字>周小星</名字>    
        <年龄>23</年龄>
        <介绍>学习刻苦</介绍>
    </学生>   
    <学生>
        <名字>林晓</名字> 
        <年龄>25</年龄>
        <介绍>是一个好学生</介绍>
    </学生>   
</班级>

基本语法

元素语法

<!ELEMENT NAME CONTENT>
例如dtd文件这样写,表示家庭可以有一个到多个人和0到多个家电

<!ELEMENT 家庭(人+,家电*)>

xml文件这样写

<家庭>
    < 名字="张晓明" 性别="" 年龄="25"/>
    < 名字="李小钢" 性别="" 年龄="36" 爱好="作个教育家和伟人"/>
    <家电 名称="彩电" 数量="3"/>
</家庭>
元素类型
  • ELEMENT是关键字,是不能修改的

  • NAME表示元素名称

  • CONTENT是元素类型,必须要大写!CONTENT的内容有三种写法:

    EMPTY——表示该元素不能包含子元素和文本,但可以有属性。
    ANY——表示该元素可以包含任何在该DTD中定义的元素内容
    #PCDATA——可以包含任何字符数据,但是不能在其中包含任何子元素

    元素的组合类型
符号用途示例
()用来给元素分组(古龙|金庸),(王朔|余杰)
|在列出的对象中选择一个(男人|女人)
+该对象必须出现一次或者多次(成员+)
*该对象允许出现0次或者多次(爱好*)
?该对象必须出现0次或者1次(菜鸟?)
,对象必须按指定的顺序出现(西瓜,苹果,香蕉)

属性语法

<!ATTLIST 元素名称
    属性名称 类型 属性特点
    属性名称 类型 属性特点......  
>

我们想在学生这个子元素上加上地址这个属性

<!ATTLIST 学生
    地址 CDATA #REQUIRED
>

属性特点

  • #REQUIRED,表示这个属性必须给,不给就报错
  • #IMPLIED,表示这个属性可以给也可以不给
  • #FIXED value,表示这个属性必须给一个固定的value值
  • Default value,表示这个属性如果没有值,就分配一个默认的value值

属性类型

  • CDATA 属性值可以是任何字符(包括中文和数字)
  • ID 该属性的取值必须是唯一的,但是属性的值不能是以数字开头!
  • IDREF/IDREFS
    • IDREF属性的值指向文档中其它地方声明的ID类型的值
    • IDREFS,具有由空格分开的多个引用。
<家庭>
    < relID="P_1" name="爸爸"/>
    < relID="P_2" name="妈妈"/>
    < relID="P_3" parentID="P_1 P_2" name="儿子"/>
</家庭>
  • Enumerated 事先定义好一些值,属性的值必须在所列出的值的范围内
<!ATTLIST person
    婚姻状态 (single|married|divorced|widowed) #IMPLIED
>

DTD实体ENTITY/ENTITIES

  • 实体用于为一段内容创建一个别名,以后在XML文档中就可以使用别名引用这段内容了
  • 在DTD定义中,一条!ENTITY语句用于定义一个实体。
  • 实体可分为两种类型:引用实体和参数实体。引用实体是被XML文档应用的,而参数实体是被DTD文件本身应用的。

引用实体

<!ENTITY 实体名称 "实体内容">
引用方式:&实体名称; 末尾要带上分号,这个引用将直接转变成实体内容

<!ENTITY copyright "I am a programmer">
....
&copyright;

参数实体

<!ENTITY % 实体名称 "实体内容">
引用方式为:%实体名称

<!ENTITY % TAG_NAME "姓名|EMAIL|电话|地址">
<!ELEMENT 个人信息 (%TAG_NAME;|生日)>
<!ELEMENT 客户信息 (%TAG_NAME;|公司名)>

其实就是定义一个变量来提取哪些重复冗余的数据

DTD文档的声明及引用

内部DTD文档

<!DOCTYPE 根元素 [定义内容]>
<!DOCTYPE scores[
	<!ELEMENT scores (student+)>
	<!ELEMENT student (name,course,score)>
	<!ATTLIST student id CDATA #REQUIRED>
	<!ELEMENT name (#PCDATA)>
	<!ELEMENT course (#PCDATA)>
	<!ELEMENT score (#PCDATA)>
]>

<scores>
    <student  id="1">
        <name>www</name>
        <course>java</course>
        <score>66</score>
    </student>
</scores>

外部DTD文档

  • 引用本地文件,用SYSTEM标识,并写上”DTD的文件路径”,如下:
<!DOCTYPE 根元素 SYSTEM "DTD文件路径">
  • 如果引用的DTD文件是一个公共的文件时,采用PUBLIC标识,如下方式:
<!DOCTYPE 根元素 PUBLIC "DTD名称" "DTD文件的URL">

本文参考于# XML——XML文件约束之DTD详解

  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
假设我们有一个下面这样的XML文件: ```xml <?xml version="1.0" encoding="UTF-8"?> <bookstore> <book category="Children"> <title lang="en">Harry Potter</title> <author>J.K. Rowling</author> <year>2005</year> <price>29.99</price> </book> <book category="Web"> <title lang="en">Learning XML</title> <author>Erik T. Ray</author> <year>2003</year> <price>39.95</price> </book> </bookstore> ``` 我们可以为这个XML文件添加一个DTD约束,让它符合特定的规范。下面是一个简单的例子: ```xml <?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE bookstore [ <!ELEMENT bookstore (book+)> <!ELEMENT book (title, author, year, price)> <!ATTLIST book category CDATA #REQUIRED> <!ELEMENT title (#PCDATA)> <!ELEMENT author (#PCDATA)> <!ELEMENT year (#PCDATA)> <!ELEMENT price (#PCDATA)> ]> <bookstore> <book category="Children"> <title lang="en">Harry Potter</title> <author>J.K. Rowling</author> <year>2005</year> <price>29.99</price> </book> <book category="Web"> <title lang="en">Learning XML</title> <author>Erik T. Ray</author> <year>2003</year> <price>39.95</price> </book> </bookstore> ``` 在上面的例子中,我们使用了`<!DOCTYPE>`元素来定义DTD约束。`<!ELEMENT>`元素用来定义XML元素的结构,`<!ATTLIST>`元素用来定义XML元素的属性,`(#PCDATA)`表示元素内容为文本类型。注意,DTD约束必须位于XML文件的第一行,紧随XML声明之后。 这是一个非常简单的例子,实际上,DTD约束可以包含更多的定义,比如实体、命名空间等。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值