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)。属性的名称可以任意起名。属性的类型有以下几种:
默认参数可以使用下列值:
我们来使用属性描述上面例子中的属性
<!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,比较好用。
![](https://img-blog.csdn.net/20160901205018069?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center)
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)>
]>
引用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)>
]>
相关文章推荐
- xml约束DTD演示
- [xml]DTD & Schema 约束
- xml约束之dtd约束和schema约束---3
- 心得2--XML约束--DTD精讲
- XML文件约束之DTD详解以及xml文件的dtd描述文件本地化
- XML简介之DTD约束的相关实例
- XML约束技术-DTD约束
- eclipse添加dtd约束和xml约束的方法
- XML(二)之DTD——XML文件约束
- 日常小结-XmlDTD约束
- xml约束之dtd约束和schema约束---3
- 无废话XML--XML约束(DTD)
- XML约束——DTD
- XML的约两种约束——DTD、Schema
- 心得2--XML约束--DTD精讲
- XML约束之DTD
- Java_xml_dtd约束规范实例
- 使用dtd制作XML约束
- day04 onsubmit事件 XML的简介,语法,DTD约束和解析
- xml约束之dtd约束和schema约束---3