通过实例来学习XML DTD

使用DTD的原因:

注意:由于它自身的一些缺点,DTD终将被淘汰,但是它还是要学习的。学习完DTD后,后面继续学习XML Schema。
1,通过 DTD,您的每一个 XML 文件均可携带一个有关其自身格式的描述。
2,通过 DTD,独立的团体可一致地使用某个标准的 DTD 来交换数据。
3,您的应用程序也可使用某个标准的 DTD 来验证从外部接收到的数据。
您还可以使用 DTD 来验证您自身的数据。
XML文件

<?xml version="1.0" encoding="utf-8"?>
<!--导入外部dtd文件--> 
<!DOCTYPE Students SYSTEM "Students.dtd">

<Students> 
 <Student num="z001">  
    <name>小明</name>
    <sex></sex>    
    <age>20</age>  
    <subject><![CDATA[数学&英语]]></subject>  
    <sport>篮球</sport> 
  </Student>  
  <Student num="z002"> 
    <name>小红</name>
    <sex></sex>    
    <age>21</age>  
    <subject><![CDATA[数学&英语]]></subject>  
    <sport>篮球</sport> 
  </Student>  
  <Student num="z003"> 
    <name>小蓝</name>
    <sex></sex>    
    <age>23</age>  
    <subject><![CDATA[数学&英语]]></subject>  
    <sport>篮球</sport> 
  </Student>   
</Students>

DTD文件:
DTD注释格式:<![ IGNORE [ 注释的内容 ]]>

<![ IGNORE [定义Student子元素必须在 Studens父 元素内出现至少一次。]]>
<!ELEMENT Students (Student+)>

<![ IGNORE [ 设置Student元素中必须有name,age,subject,sport元素并且他们的出现顺序也必须是这样的]]>
<!ELEMENT Student (name,sex,age,subject,sport)>

<![ IGNORE [ 设置num属性为必需且唯一的但是属性的值不能是以数字开头]]>
<!ATTLIST Student
    num ID #REQUIRED
>

<![ IGNORE [ !ELEMENT name 定义 name 元素为 "#PCDATA" 类型
              !ELEMENT sex 定义 sex元素为 "#PCDATA" 类型,下同
]]>
<!ELEMENT name      (#PCDATA)>
<!ELEMENT sex      (#PCDATA)>
<!ELEMENT age       (#PCDATA)>
<!ELEMENT subject   (#PCDATA)>
<!ELEMENT sport     (#PCDATA)>

测试的html文件:

<html>
    <head>
    <!--自己编写一个简单的解析工具,去解析XML DTD是否配套-->     
    <script language="javascript">
        // 创建xml文档解析器对象
        var xmldoc = new ActiveXObject("Microsoft.XMLDOM");
        // 开启xml校验
        xmldoc.validateOnParse = "true";
        // 装载xml文档,即指定校验哪个XML文件
        xmldoc.load("Students.xml");
        document.writeln("错误信息:"+xmldoc.parseError.reason+"<br>");
        document.writeln("错误行号:"+xmldoc.parseError.line);
    </script>

    </head>
    <body>

    </body>
</html>

先来用IE测试一下(必须用ie而且需要把IE浏览器的编码格式改为UTF-8其他浏览器兼容模式也OK)
错误为0
大家可以看到我们的XML文件完全符合DTD的要求,下面我们来修改一下我们的XML文件
(1)将第6行的num属性删去的再刷新网页得到的结果是:
这里写图片描述
(2)删除第11行的sport元素
这里写图片描述
(3)将num=”z001”的学生的sex元素和name元素调换位置
这里写图片描述
这是我们作业的一小部分后面还要用C++解析(java解析的已经完成,博客里也有)。之前就看过DTD但是只是草草的过了一下,今天重新学了一下。希望大家通过这个例子可以快速掌握DTD,当然我的并不全面。大家可以去 DTD 教程 http://www.w3school.com.cn/dtd/index.asp 详细了解。

原文地址:https://www.cnblogs.com/snailclimb/p/9086474.html