xml-02-DTD约束

1.DTD简介

引用W3C的一段介绍:文档类型定义(DTD)可定义合法的XML文档构建模块。它使用一系列合法的元素来定义文档的结构。 DTD 可被成行地声明于 XML 文档中,也可作为一个外部引用。这句话说白了就是用来规范xml的。xml是可扩展的标记语言,元素和属性都可以任意定义,没有任何的约束。这样在给了coder权利的同时也更容易犯错误。同时也造成了数据传输的不规范性。那么为了保证对xml的验证,就引入了dtd。

因为在xml中无非就是在定义元素,给元素定义属性,然后再给元素赋值。那么dtd也就是从这些方面对xml进行约束。

在文档中引用dtd如下:

<!DOCTYPE note SYSTEM "Note.dtd">

note表示文档的根元素,SYSTEM表示引用本地的dtd文件,如果引用网络上的dtd需要使用PUBLISH,后面跟的是dtd文件的uri



2.DTD元素
使用<!ELEMENT>来定义元素,element必须大写,后面跟元素的名称。比如我们有下面xml,针对下面的xml来写DTD

<students>
     <student id="stu_001">
          <name>张三丰</name>
          <age>130</age>
     </student>
     <student id="stu_002">
          <name>令狐冲</name>
          <age>30</age>
     </student>
</students>

那么我们可以定义约束来规范这个xml的编写。让其只能写入我们定义的标签,不能使用定义之外的标签。那么我们就可以声明一段dtd(这里仅仅定义了元素,并没有关于属性的定义,属性的定义在后面属性的地方会介绍到)

<!ELEMENT students (student+) >
<!ELEMENT student (name,age) >
<!ELEMENT name (#PCDATA) >
<!ELEMENT age (#PCDATA) >

第一段声明了一个students元素,后面的括号中表示的是students元素中可以进行嵌套的标签。这里+表示通配符,表示一个或多个的意思,也就是说students中可以嵌套1个或多个student标签。除了+号之外还有?和*
*表示匹配0个或多个元素
?表示匹配0个或1个元素
+表示匹配1个或多个元素

第二段是声明了student元素,括号中表示的是student元素中必须要包含name标签和age标签。而且他们的顺序必须是先声明name标签然后声明age标签。
第三段是声明了name标签, 后面括号中表示的是name标签中嵌套的值的类型是字符串类型。

元素总结
     1.通过ELEMENT声明元素
     2.元素的内容 可以为子元素,也可以为具体的类型(#PCDATA)
     3.子元素可以使用通配符和枚举类型如(name|firstname|lastname)*  表示可以使用name或者firstname或者lastname中的任意一个。后面的*表示()中的元素可以有0个或多个。
     4.在父元素中引用的元素必须要使用ELEMENT进行声明。

3.DTD属性
使用ATTLIST来定义元素的属性,attlist必须全部大写。后面跟元素的名称,后面跟属性的名称,后面跟属性的类型,后面跟默认值。

<!ATTLIST student id ID #REQUIRED >

给student元素声明一个属性为ID类型的id属性,属性的值是必须的(#REQUIRED)。属性的名称可以任意起名。属性的类型有以下几种:

CDATA值为字符数据 (character data)
(en1|en2|..)此值是枚举列表中的一个值
ID值为唯一的 id
IDREF值为另外一个元素的 id
IDREFS值为其他 id 的列表
NMTOKEN值为合法的 XML 名称
NMTOKENS值为合法的 XML 名称的列表
ENTITY值是一个实体
ENTITIES值是一个实体列表
NOTATION此值是符号的名称
xml:值是一个预定义的 XML 值

默认参数可以使用下列值:
属性的默认值
#REQUIRED属性值是必需的
#IMPLIED属性不是必需的
#FIXED value属性值是固定的

我们来使用属性描述上面例子中的属性

<!ATTLIST student id ID #REQUIRED>
<!ATTLIST student birth CDATA #IMPLIED>

第一行定义了一个id属性,值是必须要填写的
第二行定义了一个birth属性,值是可以选择的

4.DTD实体

这是引用了w3c对实体的定义:实体是用于定义引用普通文本或特殊字符的快捷方式的变量。实体引用是对实体的引用。实体可在内部或外部进行声明。其实就相当于Android中的strings.xml中定义了真正的值,而在layout中进行引用一样。实体分为自定义实体和预定义实体,预定义实体在xml中已经说到了,比如&lt;表示<。下面我们先来看自定义实体:

<!ENTITY hello "HelloWorld" >
这里我们定义了一个名称为hello的实体,他的值为HelloWorld,在xml中我们就可以引用此实体

&hello;

5.DTD编辑器
最后给大家推荐一款编辑DTD的工具,叫做xmlspy,既可以编辑xml,也可以编辑schema,也可以编辑DTD,比较好用。

6.DTD案例
摘抄至W3School

<!DOCTYPE TVSCHEDULE [

<!ELEMENT TVSCHEDULE (CHANNEL+)>
<!ELEMENT CHANNEL (BANNER,DAY+)>
<!ELEMENT BANNER (#PCDATA)>
<!ELEMENT DAY (DATE,(HOLIDAY|PROGRAMSLOT+)+)>
<!ELEMENT HOLIDAY (#PCDATA)>
<!ELEMENT DATE (#PCDATA)>
<!ELEMENT PROGRAMSLOT (TIME,TITLE,DESCRIPTION?)>
<!ELEMENT TIME (#PCDATA)>
<!ELEMENT TITLE (#PCDATA)>
<!ELEMENT DESCRIPTION (#PCDATA)>

<!ATTLIST TVSCHEDULE NAME CDATA #REQUIRED>
<!ATTLIST CHANNEL CHAN CDATA #REQUIRED>
<!ATTLIST PROGRAMSLOT VTR CDATA #IMPLIED>
<!ATTLIST TITLE RATING CDATA #IMPLIED>
<!ATTLIST TITLE LANGUAGE CDATA #IMPLIED>

]>


<!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>

<!ENTITY NEWSPAPER "Vervet Logic Times">
<!ENTITY PUBLISHER "Vervet Logic Press">
<!ENTITY COPYRIGHT "Copyright 1998 Vervet Logic Press">

]>


<!DOCTYPE CATALOG [

<!ENTITY AUTHOR "John Doe">
<!ENTITY COMPANY "JD Power Tools, Inc.">
<!ENTITY EMAIL "jd@jd-tools.com">

<!ELEMENT CATALOG (PRODUCT+)>

<!ELEMENT PRODUCT
(SPECIFICATIONS+,OPTIONS?,PRICE+,NOTES?)>
<!ATTLIST PRODUCT
NAME CDATA #IMPLIED
CATEGORY (HandTool|Table|Shop-Professional) "HandTool"
PARTNUM CDATA #IMPLIED
PLANT (Pittsburgh|Milwaukee|Chicago) "Chicago"
INVENTORY (InStock|Backordered|Discontinued) "InStock">

<!ELEMENT SPECIFICATIONS (#PCDATA)>
<!ATTLIST SPECIFICATIONS
WEIGHT CDATA #IMPLIED
POWER CDATA #IMPLIED>

<!ELEMENT OPTIONS (#PCDATA)>
<!ATTLIST OPTIONS
FINISH (Metal|Polished|Matte) "Matte"
ADAPTER (Included|Optional|NotApplicable) "Included"
CASE (HardShell|Soft|NotApplicable) "HardShell">

<!ELEMENT PRICE (#PCDATA)>
<!ATTLIST PRICE
MSRP CDATA #IMPLIED
WHOLESALE CDATA #IMPLIED
STREET CDATA #IMPLIED
SHIPPING CDATA #IMPLIED>

<!ELEMENT NOTES (#PCDATA)>

]>
















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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值