一、了解dtd中的语法规则
1、元素声明:
<!ELEMENT 元素名称 类别> <!ELEMENT 元素名称 (元素内容)>如:
<!ELEMENT factory EMPTY> ,表示空元素
<!ELEMENT id (#PCDATA)>,元素内容为普通的文本,也就是被解析的字符数据
<!ELEMENT 元素名称 (子元素名称1 | 子元素名称2)>,带有子元素的写法
<!ELEMENT 元素名称 (子元素名称1,子元素名称 2)>,带有子元素的写法
<!ELEMENT books (book+)>,相同的元素至少出现一次
<!ELEMENT books (book*)>,同元素不出现或者多次出现
<!ELEMENT books (book?)>,同元素不出现或者出现一次
2、属性
<!ATTLIST 元素名称 属性名称 属性类型 默认值>属性的默认值
#REQUIRED 属性值是必需的
#IMPLIED 属性不是必需的
#FIXED value 属性值是固定的
如:
<!ATTLIST book
alias CDATA #REQUIRED>
二、写出想要的xml文件内容
<?xml version="1.0" encoding="UTF-8" ?>
<books>
<factory name="北京出版社" />
<book alias="java">
<id>111111</id>
<name>java核心思想</name>
<author>张圣诞</author>
</book>
<book alias="linux">
<id>2222</id>
<name>linux私房菜</name>
<author>李四</author>
</book>
</books>
三、根据xml文件格式推导出dtd的编写
1、声明所有元素
<?xml version="1.0" encoding="UTF-8" ?>
<!ELEMENT books ()>
<!ELEMENT factory EMPTY>
<!ELEMENT book ()>
<!ELEMENT id (#PCDATA)>
<!ELEMENT name (#PCDATA)>
<!ELEMENT author (#PCDATA)>
2、区分复杂元素和简单元素
复杂元素:有子元素
简单元素:没有子元素
<?xml version="1.0" encoding="UTF-8" ?>
<!ELEMENT books (book+,factory?)+>
<!ELEMENT factory EMPTY>
<!ELEMENT book (id,name,author)>
<!ELEMENT id (#PCDATA)>
<!ELEMENT name (#PCDATA)>
<!ELEMENT author (#PCDATA)>
3、给元素增加属性
<?xml version="1.0" encoding="UTF-8" ?>
<!-- book出现一次或者多次 -->
<!ELEMENT books (book+ | factory?)+ >
<!ELEMENT factory EMPTY>
<!-- name属性不是必须的 -->
<!ATTLIST factory
name CDATA #IMPLIED>
<!-- id、name、author必须出现一次 -->
<!ELEMENT book (id,name,author)>
<!-- alias属性是必须的 -->
<!ATTLIST book
alias CDATA #REQUIRED>
<!-- 元素内容是被解析的字符数据 -->
<!ELEMENT id (#PCDATA)>
<!ELEMENT name (#PCDATA)>
<!ELEMENT author (#PCDATA)>
四、在xml文件中引用dtd
(xml文件是跟dtd文件放在一个目录下)
1、dtd分为两种方式:
<1>内部dtd
将dtd内容写入到xml文件内部,只能当前文件使用;
<2>外部dtd
dtd作为单独文件存在,引入方式又分为两钟,
第一种:
SYSTEM表示DTD文件是私有的;
第二种:
PUBLIC表示DTD文件是公共的,注意在PUBLIC之后,还多了一个DTD的名称。
3、以taglib的dtd为例:
<1>关键字:DOCTYPE、PUBLIC;
<2>根元素名:taglib。每一个标签库定义文件都是以taglib为根元素的,否则就不会验证通过。
<3>"-//Sun Microsystems, Inc.//DTD JSP Tag Library 1.2//EN":
这是公共DTD的名称。这个东西命名是有些讲究的。
首先它是以"-"开头的,表示这个DTD不是一个标准组织制定的。(如果是ISO标准化组织批准的,以“ISO”开头,如果不是ISO的标准化组织批准的,以“+”开头。)。
接着就是双斜杠“//”,跟着的是DTD所有者的名字,很明显这个DTD是sun公司定的。
接着又是双斜杠“//”,然后跟着的是DTD描述的文档类型,可以看出这份DTD描述的是jsp 标签库1.2版本的格式。
再跟着的就是“//”和ISO 639语言标识符。
<4>“http://java.sun.com/dtd/web-jsptaglibrary_1_2.dtd”:表示这个DTD的位置。
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE books SYSTEM "mydtd.dtd">
<books>
<factory name="北京出版社" />
<book alias="java">
<id>111111</id>
<name>java核心思想</name>
<author>张圣诞</author>
</book>
<book alias="linux">
<id>2222</id>
<name>linux私房菜</name>
<author>李四</author>
</book>
</books>
参考资料:https://blog.youkuaiyun.com/zark721/article/details/78692844