XML中的DTD

来源:互联网 发布:淘宝店铺微淘二维码 编辑:程序博客网 时间:2024/06/13 09:09
DTD(Document Type Definition,即文档类型定义)
DTD分为:内部DTD、外部DTD和公用DTD
     内部DTD:就是指将DTD和XML数据定义放在同一文档中。<!DOCTYPE 根元素名 [元素描述]> XML文档主体
     外部DTD:就是指将DTD和XML数据定义放在不同的文档中。<!DOCTYPE 根元素名 SYSTEM "外部DTD的URI">
     公用DTD:和外部DTD最大的区别就是,使用PUBLIC替换了SYSTEM,并添加了DTD标示名。
一、定义元素:
定义任意类型的元素:<!ELEMENT 元素名 ANY>
定义空元素:<!ELEMENT 元素名 EMPTY>
定义字符串内容的元素:<!ELEMENT 元素名(#PCDATA)>
(#PCDATA)和互斥子元素共用时,#PCDATA必须放在最前面
定义有序子元素:<!ELEMENT 元素名 (name1,name2)>
定义互斥子元素:<!ELEMENT 元素名 (name1|name2)> name1和name2不能同时出现在一个子元素组中
子元素出现的频率:*(0次或多次)+(1次或多次)?(0次或1次)
it.dtd:
<?xml version="1.0" encoding="UTF-8"?>
<!ELEMENT IT (前端,后端)*>
<!ELEMENT 前端 (HTML,CSS,JS,jQuery)>
<!ELEMENT 后端 (JavaSE,JavaEE,数据库)>
<!ELEMENT HTML (#PCDATA)>
<!ELEMENT CSS (#PCDATA)>
<!ELEMENT JS (#PCDATA)>
<!ELEMENT jQuery (#PCDATA)>
<!ELEMENT JavaSE (#PCDATA)>
<!ELEMENT JavaEE (#PCDATA)>
<!ELEMENT 数据库 (#PCDATA)>
DTD.xml
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE IT SYSTEM "it.dtd" >
<IT>
    <前端>
        <HTML>是一种前端的技术</HTML>
        <CSS>层叠式样式表</CSS>
        <JS>是一种脚本语言,功能强大</JS>
        <jQuery>是JS的一个类库</jQuery>
    </前端>
    <后端>
        <JavaSE>学Java的基础</JavaSE>
        <JavaEE>包括许多框架</JavaEE>
        <数据库>最重要的一部分</数据库>
    </后端>
</IT>
二、定义元素属性:
语法:<!ATTLIST 属性所属的元素 属性名 属性类型 [元素对属性的约束][默认值]>
对元素的约束:1.#REQUIRED 必须的元素 2.#IMPLIED 可有可无的元素 3.#FIXED 该元素是固定的,定义时需要指定固定值
属性类型:最常用的就是CDATA 表示字符串数据
属性类型后面还可以是枚举类型:<!ATTLIST 肉 类型(牛肉,鸡肉) #REQUIRED>
产品.dtd
<?xml version="1.0" encoding="UTF-8"?>
        <!ELEMENT 产品 (农产品,畜产品)*>
        <!ELEMENT 农产品 (生菜,苹果)>
        <!ELEMENT 畜产品 (鸡肉,牛肉,猪肉)>
        <!ELEMENT 生菜 (#PCDATA)>
        <!ELEMENT 苹果 (#PCDATA)>
        <!ELEMENT 鸡肉 (#PCDATA)>
        <!ELEMENT 牛肉 (#PCDATA)>
        <!ELEMENT 猪肉 (#PCDATA)>
        <!ATTLIST 生菜 产地 CDATA #FIXED "我家菜地">
        <!ATTLIST 苹果 产地(山东|美国) #REQUIRED>
        <!ATTLIST 鸡肉 产地 CDATA #IMPLIED>
产品.xml
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE 产品 SYSTEM "产品.dtd" >
<产品>
    <农产品>
        <生菜 产地="我家菜地"></生菜>  <!-- 这个属性是必选项 -->
        <苹果 产地="山东"></苹果>      <!-- 这个属性是一个枚举类型 -->
    </农产品>
    <畜产品>
        <鸡肉 产地="养鸡场"></鸡肉>      <!-- 这个属性可以 可有可无 -->
        <牛肉></牛肉>
        <猪肉></猪肉>
    </畜产品>
</产品>
三、定义实体:实体引用就是用一个字符串代替另一个字符串。类似于“宏”;
1.定义实体:<!ENTITY 实体名 "实体值">
  使用实体:&实体名;(必须以 &开始 ;结束)
实体.dtd
<?xml version="1.0" encoding="UTF-8"?>
<!ELEMENT 电子设备 (电脑,手机)*>
<!ELEMENT 电脑 (台式机,笔记本)>
<!ELEMENT 手机 (智能手机,普通手机)>
<!ELEMENT 台式机 (#PCDATA)>
<!ELEMENT 笔记本 (#PCDATA)>
<!ELEMENT 智能手机 (#PCDATA)>
<!ELEMENT 普通手机 (#PCDATA)>
<!ENTITY iphone "苹果手机">
实体.xml
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE 电子设备 SYSTEM "实体.dtd">
<电子设备>
    <电脑>
        <台式机>联想一体机</台式机>
        <笔记本>华硕笔记本</笔记本>
    </电脑>
    <手机>
        <智能手机>&iphone;</智能手机>
        <普通手机>老人机</普通手机>
    </手机>
</电子设备>
注意:在浏览器端对实体的支持不佳。
2.定义参数实体:<!ENTITY % 实体名 "实体值">
使用实体:%实体名;(必须以 %开始 ;结束)
参数实体.dtd
<?xml version="1.0" encoding="UTF-8"?>
<!ELEMENT 图书 (漫画,杂志)*>
<!ELEMENT 漫画 (漫画1,漫画2)>
<!ELEMENT 杂志 (杂志1,杂志2)>
<!ELEMENT 漫画1 (#PCDATA)>
<!ELEMENT 漫画2 (#PCDATA)>
<!ELEMENT 杂志1 (#PCDATA)>
<!ELEMENT 杂志2 (#PCDATA)>
<!ENTITY % price "10|20|30|40">
<!ATTLIST 漫画1 价格 (%price;) #REQUIRED>
<!-- 在此注意必须先创建参数实体,才能使用 -->
参数实体.xml
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE 图书 SYSTEM "参数实体.dtd">
<图书>
    <漫画>
        <漫画1 价格="30">漫画1</漫画1>
        <漫画2>漫画2</漫画2>
    </漫画>
    <杂志>
        <杂志1>杂志</杂志1>
        <杂志2>杂志</杂志2>
    </杂志>
</图书>
3.外部实体:<!ENTITY实体名 SYSTEM "实体值所在文件的URI">
外部实体.dtd
<?xml version="1.0" encoding="UTF-8"?>
        <!ELEMENT 饮料 (碳酸饮料,果汁饮料)*>
        <!ELEMENT 碳酸饮料 (可乐,雪碧)>
        <!ELEMENT 果汁饮料 (橙汁,桃汁)>
        <!ELEMENT 可乐 (#PCDATA)>
        <!ELEMENT 雪碧 (#PCDATA)>
        <!ELEMENT 橙汁 (#PCDATA)>
        <!ELEMENT 桃汁 (#PCDATA)>
        <!ENTITY introduce SYSTEM "introduce.txt">
introduce .txt
<?xml version="1.0" encoding="UTF-8"?>
可口可乐是一种非常非常好喝的饮料,但是喝多了对身体不好哦。一个月喝一次就行了
外部实体.xml
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!DOCTYPE 饮料 SYSTEM "外部实体.dtd">

<饮料>
    <碳酸饮料>
        <可乐>&introduce;</可乐>
        <雪碧>雪碧不好喝</雪碧>
    </碳酸饮料>
    <果汁饮料>
        <橙汁>橙汁不好喝</橙汁>
        <桃汁>桃汁不好喝</桃汁>
    </果汁饮料>
</饮料>

作者个人博客:http://blog.csdn.net/y694721975
            

1 0
原创粉丝点击