DTD是什么?
文档类型定义(DTD)是“标记声明”的一个集合,用于定义SGML系列标记语言(SGML,XML,HTML)的“文档类型”。
DTD定义XML文档的结构、合法元素、属性。
简单的说:一个DTD文件描述了一个XML文件的结构。
为什么使用DTD?
通过 DTD,您的每一个XML文件均可携带一个有关其自身格式的描述。(规定XML结构)
通过 DTD,不同的组织可以一致地使用某个标准的DTD来交换数据。(规范数据结构)
而您的应用程序也可使用某个标准的DTD来验证从外部接收到的数据。(数据结构合法性检查)
如何使用DTD?
DTD用于定义XML的结构,它可以在XML文档中声明(“内联声明”),也可以引入XML文档(“外部引用声明”)。
内联声明
<?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>George</to> <from>John</from> <heading>Reminder</heading> <body>Don't forget the meeting!</body> </note>
外部引用声明
外部引用声明是将DTD与XML分离,因此需要定义两个文件:
用于定义的note.dtd文件:
<!ELEMENT note (to,from,heading,body)> <!ELEMENT to (#PCDATA)> <!ELEMENT from (#PCDATA)> <!ELEMENT heading (#PCDATA)> <!ELEMENT body (#PCDATA)>
包含数据的note.xml文件:
<?xml version="1.0"?> <!DOCTYPE note SYSTEM "note.dtd"> <note> <to>George</to> <from>John</from> <heading>Reminder</heading> <body>Don't forget the meeting!</body> </note>
简单示例
使用DTD校验XMl文件
文件people.dtd的内容如下:
<!ELEMENT people_list (person)*> <!ELEMENT person (name, birthdate?, gender?, socialsecuritynumber?)> <!ELEMENT name (#PCDATA)> <!ELEMENT birthdate (#PCDATA)> <!ELEMENT gender (#PCDATA)> <!ELEMENT socialsecuritynumber (#PCDATA)>
文件peopel.xml的内容如下:
<?xml version="1.0" encoding="UTF-8" standalone="no"?> <people_list> <person> <name>Fred Bloggs</name> <birthdate>2008-11-27</birthdate> <gender>Male</gender> </person> </people_list>
执行如下命令来校验DTD文件:
如果格式正确,则不会有任何输出。如果people.xml的格式与people.dtd中的描述不匹配,则会产生错误提示。你可以尝试将person.xml中的<person>…<person>修改来<persons>…<persons>,然后执行命令,并观察输出。
相关教程
W3school/DTD 教程
参考文献
Wikipedia/Document type definition
Wikipedia/XML
xmllint : how to validate an XML using a local DTD file
Validate XML using a DTD
How to validate an XML document by using DTD, XDR, or XSD in Visual Basic