一、DTD简介
文档类型定义(DTD)可定义合法的XML文档构建模块。它使用一系列合法的元素来定义文档的结构。
有了DTD文档后,xml就需按照DTD中的规范来书写
DTD 可被成行地声明于 XML 文档中,也可作为一个外部引用。
二、内部DTD
示例代码
<?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 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>
其中note.dtd就是一个外部的dtd文件
四、DTD中的实体
DTD中定义的例如ELEMENT是元素,他对应着xml中的标签,DTD中还可以定义xml实体。
内部实体
<!DOCTYPE foo [
<!ELEMENT foo ANY >
<!ENTITY xxe "test" >]ENTITY定义了一个xxe实体,这个实体的内容就是test,可以简略的理解为xxe这个实体是一个变量的作用。
xxe可以在xml中进行引用
引用方式: &xxe;
这样输出的时候xxe会被test替代。
外部实体
<?xml version="1.0" encoding="ISO-8859-1"?>
<!DOCTYPE foo [
<!ELEMENT foo ANY >
<!ENTITY xxe SYSTEM "file:///c:/test.dtd" >]>
<creds>
<user>&xxe;</user>
<pass>mypass</pass>
</creds>!ENTITY xxe SYSTEM "file:///c:/test.dtd"
这一句定义了一个外部的实体,通过file协议读取
- 外部实体支持的协议
五、通用实体&参数实体
通用实体
上面定义的实体都是通用实体,他们的引用方式都是
&name;
在DTD中定义,xml标签中引用;
<user>&name;</user>
参数实体
(1)使用
% 实体名
(这里面空格不能少) 在 DTD 中定义,并且只能在 DTD 中使用%实体名;
引用 (2)只有在 DTD 文件中,参数实体的声明才能引用其他实体 (3)和通用实体一样,参数实体也可以外部引用示例代码:
<!ENTITY % an-element "<!ELEMENT mytag (subtag)>">
<!ENTITY % remote-dtd SYSTEM "http://somewhere.example.org/remote.dtd">
%an-element; %remote-dtd;