【XML基础-2】深入理解XML中的语义束缚:DTD详解

打印 上一主题 下一主题

主题 1552|帖子 1552|积分 4658

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?立即注册

x
XML(可扩展标记语言)作为数据互换的标准格式,在Web服务和应用步调间数据通报中饰演着告急角色。而确保XML文档布局精确性和语义一致性的关键,就在于文档类型定义(DTD)。本文将全面解析DTD的概念、语法布局、应用场景及其优缺点,帮助开发者更好地利用这一强大的语义束缚工具。
1. DTD概述:XML的语义保卫者

文档类型定义(Document Type Definition,简称DTD)是一种用于定义XML文档布局和正当构建模块的规范。它规定了XML文档中答应出现的元素、属性、实体以及它们之间的相互关系,为XML文档提供了语义层面的束缚。
DTD的焦点作用


  • 定义XML文档的正当布局
  • 规定元素和属性的利用规则
  • 声明可用的实体引用
  • 确保差别系统间互换的XML数据格式一致
  1. <!-- 一个简单的DTD示例 -->
  2. <!DOCTYPE bookstore [
  3.   <!ELEMENT bookstore (book+)>
  4.   <!ELEMENT book (title, author, price)>
  5.   <!ELEMENT title (#PCDATA)>
  6.   <!ELEMENT author (#PCDATA)>
  7.   <!ELEMENT price (#PCDATA)>
  8.   <!ATTLIST book category CDATA #REQUIRED>
  9. ]>
复制代码
2. DTD语法布局详解

2.1 元素声明

元素是XML文档的基本构建块,DTD中利用<!ELEMENT>声明元素:
  1. <!ELEMENT 元素名 元素内容说明>
复制代码
元素内容类型
类型阐明示例(#PCDATA)可解析字符数据<!ELEMENT title (#PCDATA)>EMPTY空元素<!ELEMENT br EMPTY>ANY可包罗任何内容<!ELEMENT note ANY>(子元素序列)特定子元素序列<!ELEMENT book (title,author)>混合内容文本和子元素混合`<!ELEMENT para (#PCDATAemstrong)*>` 元素数目指示符
符号含义示例?0次或1次<!ELEMENT author (name?)>*0次或多次<!ELEMENT chapter (para*)>+1次或多次<!ELEMENT books (book+)>无恰好1次<!ELEMENT title (#PCDATA)> 2.2 属性声明

属性为元素提供附加信息,利用<!ATTLIST>声明:
  1. <!ATTLIST 元素名 属性名 属性类型 默认值>
复制代码
常见属性类型
类型阐明示例CDATA字符数据<!ATTLIST book title CDATA #IMPLIED>ID唯一标识符<!ATTLIST book isbn ID #REQUIRED>IDREF/IDREFS引用ID/ID列表<!ATTLIST author books IDREFS #IMPLIED>NMTOKEN/NMTOKENS正当XML名称/名称列表<!ATTLIST product codes NMTOKENS #REQUIRED>枚举值限定取值列表`<!ATTLIST payment method (cashcredit) “cash”>` 默认值类型
值阐明示例#REQUIRED属性必须提供<!ATTLIST book id ID #REQUIRED>#IMPLIED属性可选<!ATTLIST book edition CDATA #IMPLIED>#FIXED “值”固定属性值<!ATTLIST company name CDATA #FIXED "ACME">默认值未指定时的默认值<!ATTLIST book inStock CDATA "yes"> 2.3 实体声明

实体用于定义可重用的内容或特殊字符:
  1. <!ENTITY 实体名 "实体值">
复制代码
实体类型


  • 内部实体:<!ENTITY copyright "Copyright 2023">
  • 外部实体:<!ENTITY logo SYSTEM "logo.svg">
  • 参数实体(仅用于DTD内部):<!ENTITY % commonattrs "id ID #IMPLIED class CDATA #IMPLIED">
3. DTD的引用方式

3.1 内部DTD

直接嵌入XML文档内部:
  1. <?xml version="1.0"?>
  2. <!DOCTYPE note [
  3.   <!ELEMENT note (to,from,heading,body)>
  4.   <!ELEMENT to (#PCDATA)>
  5.   <!ELEMENT from (#PCDATA)>
  6.   <!ELEMENT heading (#PCDATA)>
  7.   <!ELEMENT body (#PCDATA)>
  8. ]>
  9. <note>
  10.   <to>Tove</to>
  11.   <from>Jani</from>
  12.   <heading>Reminder</heading>
  13.   <body>Don't forget me this weekend!</body>
  14. </note>
复制代码
3.2 外部DTD

引用独立的DTD文件,得当多文档共享同一布局:
  1. <!-- XML文件 -->
  2. <?xml version="1.0"?>
  3. <!DOCTYPE note SYSTEM "note.dtd">
  4. <note>
  5.   <!-- 内容同上 -->
  6. </note>
  7. <!-- note.dtd文件内容 -->
  8. <!ELEMENT note (to,from,heading,body)>
  9. <!ELEMENT to (#PCDATA)>
  10. <!ELEMENT from (#PCDATA)>
  11. <!ELEMENT heading (#PCDATA)>
  12. <!ELEMENT body (#PCDATA)>
复制代码
3.3 公共DTD

引用公开可用的标准DTD:
  1. <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
  2. "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
复制代码
4. DTD高级特性

4.1 条件包罗与忽略

利用参数实体实现条件化DTD片断:
  1. <!ENTITY % strict "IGNORE">
  2. <!ENTITY % loose "INCLUDE">
  3. <![%strict;[
  4.   <!ELEMENT img EMPTY>
  5. ]]>
  6. <![%loose;[
  7.   <!ELEMENT img (#PCDATA|em|strong)*>
  8. ]]>
复制代码
4.2 定名空间支持

固然DTD本身不直接支持XML定名空间,但可以通过特定方式共同利用:
  1. <!ELEMENT xhtml:div ANY>
  2. <!ATTLIST xhtml:div
  3.   xmlns:xhtml CDATA #FIXED "http://www.w3.org/1999/xhtml"
  4.   class CDATA #IMPLIED>
复制代码
4.3 模块化DTD设计

通过参数实体实现DTD模块化:
  1. <!ENTITY % common.attrs
  2. "id      ID      #IMPLIED
  3.   class   CDATA   #IMPLIED
  4.   style   CDATA   #IMPLIED"
  5. >
  6. <!ELEMENT p (%inline;)*>
  7. <!ATTLIST p %common.attrs;>
复制代码
5. DTD验证实践

5.1 利用XML解析器验证

大多数XML解析器支持DTD验证,以Java为例:
  1. DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
  2. factory.setValidating(true);  // 启用验证
  3. factory.setNamespaceAware(true);
  4. DocumentBuilder builder = factory.newDocumentBuilder();
  5. builder.setErrorHandler(new CustomErrorHandler());  // 自定义错误处理
  6. Document doc = builder.parse(new File("document.xml"));
复制代码
5.2 在线验证工具



  • W3C Markup Validation Service
  • XMLValidation.com
  • Oxygen XML Editor内置验证器
6. DTD与XML Schema对比

特性DTDXML Schema (XSD)语法专用语法XML语法数据类型有限的基本类型丰富的数据类型系统定名空间支持有限支持完全支持扩展性有限高度可扩展复杂度简朴易学相对复杂面向对象特性无支持继承、多态等处理工具支持广泛当代工具更倾向XSD规范时间1998年2001年 7. DTD在当代开发中的应用场景

尽管XML Schema功能更强大,DTD仍在以下场景具有独特优势:

  • 遗留系统维护:许多老系统仍利用DTD定义文档布局
  • 简朴文档验证:对于布局简朴的XML,DTD更轻量便捷
  • SGML兼容性:必要与SGML系统交互的场景
  • 快速原型开发:初期开发阶段快速定义文档布局
  • 教学用途:学习XML验证的入门工具
8. DTD最佳实践


  • 模块化设计:将大型DTD拆分为多个可重用模块
  • 充分注释:利用注释阐明设计意图
    1. <!--
    2.   书籍类别属性:
    3.   fiction - 小说类
    4.   tech - 技术类
    5.   kids - 儿童读物
    6. -->
    7. <!ATTLIST book category (fiction|tech|kids) #REQUIRED>
    复制代码
  • 版本控制:通过实体或注释管理DTD版本
    1. <!ENTITY % version "1.2">
    2. <!-- DTD版本: %version; -->
    复制代码
  • 公道利用默认值:为常用属性设置公道默认值
  • 平衡严酷与机动:在严酷验证和扩展性间找到平衡点
9. 常见问题与办理方案

问题1:元素内容次序严酷导致机动性不敷
办理方案:利用选择符|或可选项?增长机动性
  1. <!ELEMENT person (name, (email|phone)?, address*)>
复制代码
问题2:DTD不支持丰富数据类型
办理方案:在文档注释中增补阐明,或考虑迁移到XSD
  1. <!ELEMENT price (#PCDATA)> <!-- 格式: 两位小数,如"29.99" -->
复制代码
问题3:大型DTD难以维护
办理方案:拆分为多个文件,利用参数实体引入
  1. <!ENTITY % common-defs SYSTEM "common.dtd">
  2. %common-defs;
复制代码
10. 总结

DTD作为XML技术体系中的基础验证机制,固然在某些方面被XML Schema逾越,但其简洁性、广泛兼容性和易用性使其仍在许多场景中具有不可替代的代价。理解DTD的焦点概念和高级特性,可以或许帮助开发者更好地设计和验证XML文档,确保数据互换的可靠性和一致性。
随着技术的发展,当代系统大概会更倾向于利用XML Schema或JSON Schema等更当代的验证工具,但对于必要快速实现、简朴验证或维护旧系统的场景,DTD仍然是值得掌握的实用技术。

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

南七星之家

论坛元老
这个人很懒什么都没写!
快速回复 返回顶部 返回列表