您的位置:首页 > 其它

xml-02-DTD约束

2016-09-01 20:49 176 查看
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中已经说到了,比如<;表示<。下面我们先来看自定义实体:

<!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 AR
9c45
TICLE 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)>

]>
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: