XML约束——DTD约束

约束
  • XML技术中,可以编写一个文档来约束一个XML的书写规范,约束文档定义了在XML中允许出现的元素名称、属性及元素出现的顺序等等
  • 常见约束 XML DTD 和 XML Schema

根据DTD来验证XML

需要解析器(软件程序)
根据能否对XML文档进行约束模式校验,可以将解析器分为两类:
非校验解析器(IE)和校验解析器


编程校验XML文档的正确性

IE5以上浏览器内置了XML解析工具:Microsoft.XMLDOM,可以编写javascript代码,利用这个解析工具装载xml文件,并对xml文件进行dtd验证

  • 创建xml文档解析器对象
    var xmldoc = new ActiveXObject("Microsoft.XMLDOM");
  • 开启xml校验
    xmldoc.validateOnParse = "true";
  • 装载xml文档
    xmldoc.load("book.xml");
  • 获取错误信息
    xmldoc.parseError.reason;
    xmldoc.parseError.line

编写DTD (内部定义,外部引用)

内部定义

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<!DOCTYPE 书架 [
    <!ELEMENT 书架 (书+)>
    <!ELEMENT 书 (书名,作者,售价)>
    <!ELEMENT 书名 (#PCDATA)>
    <!ELEMENT 作者 (#PCDATA)>
    <!ELEMENT 售价 (#PCDATA)>
]>
<书架>
    <书>
        <书名>浪潮之巅</书名>
        <作者>吴军</作者>
        <售价>39.00元</售价>
    </书>
</书架>

引入外部DTD文档(文档必须以UTF-8编码进行保存)

  • 当引用的DTD文档在本地时,采用如下方式:
    <!DOCTYPE 根元素 SYSTEM “DTD文档路径”>
    如:<!DOCTYPE 书架 SYSTEM “book.dtd”>
  • 当引用的DTD文档在公共网络上时,采用如下方式:
    <!DOCTYPE 根元素 PUBLIC “DTD名称” “DTD文档的URL”>
    如:<!doctype html public "-/w3c/dtd html 4.01/en" "http://www.w3.org/tr/html4/strict.dtd">

DTD文档的语法:

定义元素

使用ELEMENT关键字来声明一个XML元素
语法:<!ELEMENT 元素名称 使用规则>
使用规则
(#PCDATA):指示元素的主体内容只能是普通的文本. (Parsed Character Data)
EMPTY:用于指示元素的主体为空。比如<br/>
ANY:用于指示元素的主体内容为任意类型
(子元素):指示元素中包含的子元素
定义子元素及描述它们的关系:
如果子元素用逗号分开,说明必须按照声明顺序去编写XML文档。
如果子元素用“|”分开,说明任选其一。
用+、*、?来表示元素出现的次数
如果元素后面没有+*?:表示必须且只能出现一次
+:表示至少出现一次,一次或多次
*:任意次。表示可有可无,零次、一次或多次
?:表示可以有也可以无,有的话只能有一次。零次或一次


定义属性

使用ATTLIST关键字来为一个元素声明属性
`语法:
<!ATTLIST 元素名
属性名1 属性值类型 设置说明
属性名2 属性值类型 设置说明

**属性值类型:**CDATA:表示属性的取值为普通的文本字符串
枚举,只能从枚举列表中任选其一ID:表示属性的取值不能重复**设置说明**#REQUIRED:表示该属性必须出现#IMPLIED:表示该属性可有可无#FIXED:表示属性的取值为一个固定值。语法:#FIXED "固定值"直接值:表示属性的取值为该默认值`

<?xml version = "1.0" encoding="GB2312" standalone="yes"?>
<!DOCTYPE 购物篮 [
    <!ELEMENT 肉 EMPTY>
    <!ATTLIST 肉 品种 ( 鸡肉 | 牛肉 | 猪肉 | 鱼肉 ) "鸡肉">
]> 
<购物篮>
    <肉 品种="鱼肉"/>
    <肉 品种="牛肉"/>
    <肉/>
</购物篮>

定义实体

定义实体就是为一段内容指定一个名称,使用时通过这个名称就可以引用其所代表的内容。在DTD文档中使用ENTITY关键字来声明一个实体。
实体可分为:引用实体和参数实体,两者的语法不同

定义引用实体

概念:在DTD中定义,在XML中使用
语法:<!ENTITY 实体名称 “实体内容”>
引用方式(在XML中使用):&实体名称;

定义参数实体(了解)

概念:在DTD中定义,在DTD中使用
语法:<!ENTITY % 实体名称 “实体内容”>
引用方式(在DTD中使用):%实体名称;

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 217,277评论 6 503
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,689评论 3 393
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 163,624评论 0 353
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,356评论 1 293
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,402评论 6 392
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,292评论 1 301
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,135评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,992评论 0 275
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,429评论 1 314
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,636评论 3 334
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,785评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,492评论 5 345
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,092评论 3 328
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,723评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,858评论 1 269
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,891评论 2 370
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,713评论 2 354

推荐阅读更多精彩内容