xml约束技术之dtd

最后更新于:2022-04-01 14:17:10

> DTD(文档类型定义)的作用是定义 XML 文档的合法构建模块。这篇文章作简单介绍下DTD的用法。想学习完整的请点击下面w3c的教程。 ### 1.[DTD官方教程](http://www.runoob.com/dtd/dtd-tutorial.html) ##2.xml约束技术: DTD约束:语法相对简单,功能也相对简单。先出现 Schema约束:语法相对复杂,功能也相对强大。采用和xml语法类似的编写方式,Schema约束出现就是为了替换DTD约束。 ### 3.DTD简介:   文档类型定义(DTD)可定义合法的XML文档构建模块。它使用一系列合法的元素来定义文档的结构。DTD 可被成行地声明于 XML 文档中,也可作为一个外部引用。 ### 3.1导入DTD的方式: 1.内部导入: ~~~ #导入方式: <!DOCTYPE root-element [element-declarations]> #实例: <?xml version="1.0"?> <!DOCTYPE note [ <!ELEMENT note (to,from,heading,body)> <!ELEMENT to (#PCDATA)> <!ELEMENT from (#PCDATA)> <!ELEMENT heading (#PCDATA)> <!ELEMENT body (#PCDATA)> ]> <note> <to>Tove</to> <from>Jani</from> <heading>Reminder</heading> <body>Don't forget me this weekend</body> </note> ~~~ 1. (第二行)定义此文档是 note(根标签) 类型的文档。 1. (第三行)定义 note 元素有四个元素(标签):”to、from、heading,、body” 1. (第四行)定义 to 元素为 “#PCDATA” 类型 1. (第五行)定义 frome 元素为 “#PCDATA” 类型 1. (第六行)定义 heading 元素为 “#PCDATA” 类型 1. (第七行)定义 body 元素为 “#PCDATA” 类型 2.外部导入方式:   本地文件: ~~~ #导入方式: <!DOCTYPE note SYSTEM "note.dtd"> #note.dtd文件内容: <!ELEMENT note (to,from,heading,body)> <!ELEMENT to (#PCDATA)> <!ELEMENT from (#PCDATA)> <!ELEMENT heading (#PCDATA)> <!ELEMENT body (#PCDATA)> ~~~   公共的外部导入:一般项目采用公共外部导入,比如ssh的xml文件基本上就是采用了这种方式 ~~~ #导入方式: <!DOCTYPE 根元素 PUBLIC "http://rlovep.com/peace.dtd"> #如hibernate.cfg.xml: <!DOCTYPE hibernate-configuration PUBLIC "-//Hibernate/Hibernate Configuration DTD 3.0//EN" "http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd"> ~~~ ### 3.2DTD语法:   1.约束标签  语法: ~~~ <!ELEMENT 元素名称 类别> 或 <!ELEMENT 元素名称 (元素内容)> ~~~  类别: 1. 空标签: EMPTY。 表示元素一定是空元素.例如:<bb/>: ~~~ 顺序问题: <!ELEMENT 元素名称 (子元素名称 1,子元素名称 2,.....)>: 按顺序出现子标签 次数问题: 标签 : 必须且只出现1次。 标签+ : 至少出现1次 标签* : 0或n次。 标签? : 0 或1次。 声明"非.../既..."类型的内容 ~~~   2.约束属性:  语法: ~~~ <!ATTLIST 元素名称 属性名称 属性类型 默认值> ~~~  属性类型: ~~~ CDATA :表示普通字符串 (en1|en2|..): 表示一定是任选其中的一个值 ID:表示在一个xml文档中该属性值必须唯一。值不能以数字开头 ~~~  默认值: ~~~ #REQUIRED 属性值是必需的 #IMPLIED 属性不是必需的 #FIXED value 属性不是必须的,但属性值是固定的 ~~~ ### 3.3测试如下,请细看注释: ~~~ <?xml version="1.0"?> <!DOCTYPE note [ <!ELEMENT note (to,from+,heading*,body?,(br|b))> <!--带有子序列的元素,需要按照先后顺序出现; to只能出现一次 from最少出现一次 heading次数随意 body出现零次或者一次 非出现br就出现b --> <!--元素约束--> <!ELEMENT to (#PCDATA)><!--pcdata元素--> <!ELEMENT from ANY><!--任何内容的元素--> <!ELEMENT heading (#PCDATA)> <!ELEMENT body (#PCDATA)> <!ELEMENT br EMPTY><!--空元素--> <!ELEMENT b EMPTY><!--空元素--> <!--属性约束--> <!ATTLIST to number CDATA #REQUIRED><!--必须有属性值出现,且属性值类型为字符串--> <!ATTLIST from length CDATA "10"><!--默认属性值,不写出属性时属性值为10--> <!--假如您不希望强制作者包含属性,并且您没有默认值选项的话,请使用关键词 #IMPLIED。--> <!ATTLIST heading length CDATA #IMPLIED> <!ATTLIST body length CDATA #FIXED "123"><!--属性拥有固定的值,并不允许作者改变这个值--> <!ATTLIST br type (check|cash) "cash"><!--属性值可以为check和cash中的一个--> ]> <note> <to number="1234">Tove</to> <from>Jani</from> <heading length="10">Reminder</heading> <body length="123">Don't forget me this weekend</body> <br type="check"/> </note> ~~~
';