XML文档约束之DTD

       在任何一个XML文档中应包括头部(header)和内容(content)这两部分。其中,头部除了要声明所遵循的标准和字符集编码之外,还可以通过引入相关的约束来保证整个文档结构的完整性。目前,比较常用的约束手段有如下三种方式:

       1)DTD:XML1.0规范的一部分,简单但不灵活;

       2)Schema:灵活但复杂;

       3)RELAX NG:针对XML Schema复杂性而产生的一种约束模式,融合了DTD的简单性和XML Schema的灵活性,但不具备XML Schema的全部特性。      

        DTD的约束主要涉及到元素和当前元素属性的定义,包括:元素的名称、元素所包含的内容、子元素的个数和顺序、元素所具有的属性、属性的数据类型和取值范围等,根据具体的应用,这里所述的内容不是都需在DTD中有所体现。

 

1.定义元素

       包括根元素在内的所有元素都需要利用关键字ELEMENT来定义,其语法如下:

        <!ELEMENT 元素名 内容模式 >

        其中红色部分的内容为固定不变的,而内容模式是定义当前元素应包含的子元素(组),子元素出现的个数和顺序,以及是否可包含文本内容等。

 

2.元素的内容模式

      即上述内容模式可能是由如下几种情况之一构成的:

       1)  (子元素1 | 子元素2 | 子元素n)   或 (子元素1,子元素2,子元素n)

       其中,“|”号表示元素之间“或”的关系,即表示可以包含子元素1,或子元素2,或子元素3。另外,还可以用逗号“,”来分割,表示这些子元素出现在父元素中的先后次序。

       在这种情况下,还可以用“量词”来量化各子元素(组)出现的次数。

       ? :0次或1次(0|1)

       + :一次或多次(1...N)

       *  :0次或多次(0...N)

       无量词作用时,则默认表示有且必须出现一次。

       例如:

       <!ELEMENT a(sa?) >表示子元素sa在元素a中那么不出现,要么只出现一次,而<!ELEMENT a(sa,sb,sc)+ >则表示sa、sb和sc至少依次嵌套在a元素中一次。

       2) (#PCDATA)

       表示当前元素只能包含纯文本内容。

       例如,针对元素a,

              <a>test</a>、<a></a>和</a>都是合法的,

              而<a><sa>test<sa></a>是非法的。

       3) EMPTY

       表示当前元素不能包含任何嵌套的子元素和文本内容。例如,针对元素a,只有在<a />和<a></a>这两种情况下是合法的。

       4) ANY

       表示当前元素可以包含任意数量和顺序的子元素和文本内容。在这种情况下,和没有引入DTD时是一样的效果,只要遵循XML文档结构的基本规则即可。

       在定义元素时,内容模式部分是不能被省略的。例如,当我们定义一个bean元素时,即使对它内部嵌套没有明确的内容约束时,也需要在最后加上ANY来加以说明:<!ELEMENT bean ANY >

       上述的内容模式还可以组合使用,例如<!ELEMENT bean (a|(b*,c)+)? >。

 

3.定义元素的属性

        定义元素的属性是通过关键字ATTLIST来进行的,其语法如下:

        <!ATTLIST 元素名 属性名 属性值类型/取值范围 是否可选>

        其中红色部分的内容为固定不变的,元素名是指拥有这些属性的元素,而“属性名 属性值类型/取值范围 是否可选”是定义某一个属性所必须具备的三要素,称为属性列表。另外,当前元素的所有属性都应该在同一个<!ATTLIST >中定义,这意味着当有n个属性时,则应该在同一个<!ATTLIST >中定义n个属性列表。

        

4.属性列表

        1)属性名

         即一般的文本值,只要符合XML基本的规范即可。

         2)属性值类型/取值范围         当某个属性无明确的取值范围时,则需指定该属性值的类型,一般就是一个文本类型CDATA;当某个属性有明确的取值范围时,则必须用括号“()”将所有备选值括起来,并且备选值之间用“|”分割,表示这是一个n选一的操作。例如:

         type (string | int | boolean)

         表示type属性值只能是string、int或boolean。

         3)是否可选

         可用#REQUIRED(必选)或#IMPLIED(可选)来表示,根据实际的应用场景来设置即可。例如:                  type CDATA #REQUIRED

         表示必选的type属性的值为任意的文本字符。

 

5.定义DTD

    temple.dtd

 

<?xml version="1.0" encoding="UTF-8"?>

<!-- 定义XML根元素temple,其内有0个或多个bean元素  -->
<!ELEMENT templet (bean*)>

<!-- 
	1.定义bean元素,其内有0个或多个property元素  
	2.定义bean元素属性:
	  1)name  任意文本值  可选
	  2)class 任意文本值   必选
-->
<!ELEMENT bean (property*)>
<!ATTLIST bean 
    name    CDATA #IMPLIED
	class   CDATA #REQUIRED
>

<!-- 
	1.定义property元素,无任何嵌套的子元素和文本内容
	2.定义property元素属性:
	  1)name  任意文本值  必选
	  2)type  括号内所指定的某一个值  可选
	  3)ref   任意文本值  可选
-->
<!ELEMENT property EMPTY >
<!ATTLIST property 
    name    CDATA #REQUIRED
	type    (
			 java:boolean   |
			 java:byte      |
			 java:char      |
			 java:double    |
			 java:float     |
	         java:long      |
			 java:integer   |
			 java:short     |
			 java:string    
			) #IMPLIED
	ref     CDATA #IMPLIED 
>

 

6.引入DTD

       在某个XML文件头中,可通过<!DOCTYPE来引入相应的DTD文件,它有两种引入方式:

       1)远程引入

        DTD文件可能是在一个公用的网络目录上,供若干个互联网用户共同使用。其语法如下:

        <!DOCTYPE DTD标识符 PUBLIC "DTD公共标识" "DTD系统标识" >

        其中红色部分为远程引入时的固定写法。

         DTD标识符:可以为任意字符串,不过一般就取名为DTD中定义的根元素名称;

         PUBLIC:远程引入的关键字        

         DTD公共标识:以“-//”开头。

         DTD系统标识:一般就是用来指定DTD文件的URI。当公共标识无法解析时,则就用系统标识来进行。

         例如,Struts2的DTD引入如下:

         <!DOCTYPE struts PUBLIC
               "-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"
               "http://struts.apache.org/dtds/struts-2.0.dtd">

        2)本地引入

        即引入用户系统中定义的DTD文件,其语法如下:

        <!DOCTYPE DTD标识符 SYSTEM "DTD文件路径" >

        其中红色部分为远程引入时的固定写法。

        DTD标识符:(与远程引入的规则一样)

        SYSTEM:本地引入的关键字

        DTD文件路径:DTD相对于当前XML文件的路径

        例如,将第5部分定义的temple.dtd放到与temple.xml的同一个目录下后,在XML引入如下内容:

        

<?xml version="1.0" encoding="UTF-8"?>

<!-- 引入本地的DTD文件 -->
<!DOCTYPE temple SYSTEM "temple.dtd">

<temple>
	
	<bean name="user" class="com.daniele.appdemo.test.domain.User">
		<property name="id" type="java:long" />
		<property name="name" type="java:string" />
		<property name="age" type="java:integer"/>
		<property name="mail" type="java:string" />
	</bean>
	
</temple>
       在Eclipse中,当我们在文档的相应位置键入"Alt"+"/"组合键后,将会看到一系列的备选值,而这些备选值就是在temple.dtd定义的。

 

掌握DTD约束技术:XML文档结构规则详解 在信息技术的海洋中,XML(Extensible Markup Language)犹如一座灯塔,为数据交换和信息存储提供了标准化的语言。它不仅继承了SGML(Standard Generalized Markup Language)的强大功能,还具备了简洁易懂的特点。作为一种可扩展的标记语言,XML让开发者能够定义自己的标签,以适应各种不同的应用需求。本章节我们将揭开XML的神秘面纱,了解它的起源、设计理念以及如何在现代软件开发中扮演着关键角色。 阅读详情

相关推荐

Python RPA 流程自动化快速上手

Python RPA 流程自动化快速上手

看花容易绣花难 1万+

加载远程DTD文件后依然没有提示

以eclipse为例: Window–>preference–>XML–>XMlcatalog–>add 按钮 之后后弹出这个界面: 在Location中填入DTD的相应文件地址(对应文件自行下载) 注:Key type中选System ID public ID 是发布到网上,我们选择个人用的 Key粘贴远程DTD的地址 ...

Re_view的博客 266

WinDbg调试工具安装全攻略:从下载到配置的保姆级教程(Windows 10/11适用)

本文提供了一份详细的WinDbg调试工具安装与配置指南,适用于Windows 10/11用户。文章对比了WinDbg Preview独立版与SDK内置经典版的区别,并手把手指导从Microsoft Store或Windows SDK完成安装。核心部分重点讲解了如何配置符号文件路径与源代码路径,这是让WinDbg发挥强大调试功能的关键步骤,并针对常见安装问题提供了实用的排错方法。

hp777的博客 386

DTD约束

什么是DTD约束:    DTD(Document Type Definition)文档类型定义,用来约束xml文档。规定xml文档中元素的名称,子元素的名称及顺序,元素的属性等等。DTD语法:    文档声明:     1、内部DTD,在xml文档内部嵌入DTD,只对当前xml有效。&lt;?xml version="1.0" encoding="UTF-8" standalone="yes"?...

Above_my_point的博客 3269

uniapp+openlayers集成天地图实战:renderjs通信陷阱与性能优化避坑指南

本文深入探讨了uniapp与openlayers集成天地图时的renderjs通信陷阱与性能优化策略。通过实战案例解析了renderjs的特殊通信机制、地图实例生命周期管理、图层懒加载等关键技巧,帮助开发者避免常见坑点,提升应用流畅度。特别针对多语言切换、热重载偏移等疑难问题提供了解决方案,是uniapp+openlayers开发者的实用避坑指南。

weixin_30872157的博客 362

《QGIS快速入门与应用基础》151:批量属性值赋值(字段计算器)

本文介绍了QGIS中字段计算器的批量属性值赋值方法,重点讲解了简单赋值(统一值和递增序列)的操作步骤与表达式应用。文章首先强调数据备份、字段类型确认等必要前提,随后详细解析字段计算器的界面功能分区和打开方式。通过具体场景示例,展示了如何为图层统一赋值固定值或生成连续编号序列,并提供了文本、数字、日期等不同字段类型的表达式模板。文中特别提醒新手优先创建新字段而非直接更新现有字段,以避免数据丢失风险,同时推荐使用$id和rownum()函数实现基础序列生成。该教程适合GIS初学者快速掌握批量属性编辑的核心技能。

LuckyHanMo的博客 489

DTD介绍1

DTD(Document Type Definition,文档类型定义),有了DTD就可以检测XML文档的结构是否正确。通过在XML文档中包含文档类型声明,来建立当前文档和DTD的关联。当进行有效性验证的XML处理器读到该指令时,它获取DTD,并根据其中定义的规则对文档进行检验。文档类型声明必须位于XML声明之后,且在根元素(文档元素)之前。1.内部DTD     ]>文档

机器学习与神经网络 1344

YOLOv8改进 | 主干篇 | 利用MobileNetV2替换Backbone(轻量化网络结构)

本文给大家带来的改进机制是,其是专为移动和嵌入式视觉应用设计的轻量化网络结构。这些模型基于简化的架构,并利用深度可分离卷积构建轻量级深度神经网络,其引入了两个简单的全局超参数,用于在延迟和准确性之间进行有效的权衡。实验表明,MobileNets在资源和准确性的权衡方面表现出色,并在多种应用(如对象检测、细粒度分类、面部属性识别和大规模地理定位)中展现了其有效性,这个模型非常适合轻量化的读者来使用。适用检测目标:轻量化网络结构适合轻量化的读者⭐⭐⭐⭐。

Snu77的博客 5686

DTD、XML阐述、XML的两种文档类型约束和DTD的使用

XML(可扩展标记语言)是一种用于存储和传输数据的标记语言,它具有自我描述性并且易于阅读。XML被广泛应用于各种领域,如网页开发、数据交换和配置文件等。XML的基本语法规则包括使用标签、属性和值来描述数据的结构和内容。标签用尖括号包围,属性以键值对的形式出现在标签中,值则位于标签的起始和结束之间。XML 语言没有预定义的标记。上面示例中的标记(如 和 )未在任何 XML 标准中定义。这些标记是由 XML 文档的作者“发明”的。

空空bye. 3907

RK3588之内存带宽计算及达成率

本章来和大家介绍一下内存带宽的计算与达成率

文艺小少年的博客 1814

实测可复现|2026 Cloudflare盾v4.0反反爬全实战:从JS/WASM逆向到JA3指纹伪装,手把手突破拦截(附完整逆向代码+避坑手册)

本文以2026年Cloudflare盾v4.0(集成Shield Synapse v2.0)为核心,全程以实战复盘为视角,拆解了从JS/WASM混合逆向、全维度指纹伪装(JA3+浏览器指纹)、人类行为模拟,到代理池搭建的全流程,整合了完整可复现的代码,所有步骤和踩坑点均为实测所得,无任何AI套话,新手也能跟着复现,最终实现爬取成功率从12%提升至95%+。

专注于Python爬虫开发,分享爬虫技巧、项目实战与反爬经验,使用Scrapy、BeautifulSoup等工具,解决数据抓取难题。 1686

xml文档的DTD约束和Schema约束

在XML技术里,可以编写一个文档来约束一个XML文档的书写规范,这称之为XML约束。XML的约束模式有两种,一种是DTD,还有一种就是Schema。 一、DTD约束(语法简单,功能简单) 二、Schema约束(语法复杂,功能强大) 一、DTD约束 文档类型定义(DTD)可定义合法的XML文档构建模块。它使用一系列合b法的元素来定义文档的结构。 文档类型定义可被成行地声明于标准通用标记语言

我是沈君哦! 1505

R语言机器学习:XGBoost线性回归模型的SHAP值

SHAP(SHapley Additive exPlanations)值是一种基于博弈论Shapley值的机器学习模型解释方法,能够解释任何模型的预测结果。其主要用途包括:1)提高模型的可解释性,帮助非技术用户理解模型预测;2)识别对模型预测最重要的特征,辅助特征选择;3)调试模型,发现预测中的异常;4)评估模型公平性,避免偏见。SHAP值的计算方法包括初始化、迭代计算、归一化和解释,常用工具如Python的shap库支持多种计算方式(如TreeSHAP、KernelSHAP等)。本文还提供了基于R语言计算

专注生信领域 3441

XML文档约束DTD的简介和格式代码

常见的xml约束:DTD,Schema 什么是DTD DTD(Document type Definition),文档类型定义,用来约束XML文档 规定XML文档中元素的名称,子元素的名称及顺序,元素的属性等 DTD重点要求 在开发中 ,我们很少自己编写DTD约束文档,通常情况我们都是通过框架提供 的DTD约束文档,编写对应的XML文档。常见框架使用DTD约束有:struts,hibernate等 DTD语法(了解) 1.内部DTD,在XML

kaszxc的博客 430

Probability and Statistics - 4th edition

Probability and Statistics - 4th edition

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

xml文档约束(dtd)

xml文件读取方式 SAX读取方式 根据开发人员需要,一次将若千个满足条件标签加载到内存中。 优点:可以节省内存。 缺点:如果读取大量标签信息时,运行效率相对较低的。 DOM读取方式 一 次性将xml文档所有的内容,加载到内存中。 优点:如果读取大量标签信息时,此时由于是在内存中进行定位,所以运行速度较快。 缺点:浪费内存。 xml约束文档 约束文档的作用 1)设置可以在当前M文档声明的【标签类型名】 2)设置可以在标签中出现的【属性名】 3)设置标签之间父子关系和兄弟关系 约束文档分类 DTD约束文档:简

weixin_44654036的博客 305

怀旧版电脑GBC模拟器

再现原版GBC掌机的界面,电脑运行连游戏界面都一样大小,很怀旧,很真实,(英文版)强烈推荐,很小的文件,很难才找到的。

day075:XML的约束:DTD约束文档、DTD约束文档的三种引入方法、DTD语法规则

用来限定xml文件中可使用的标签以及属性。

ZuoQi的博客 1612

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

AI代理交易系统构建指南:从核心原理到安全实战

自动化交易系统通过预设规则或智能算法执行金融交易,其核心原理在于将市场数据、决策逻辑与订单执行无缝集成。这类系统的技术价值在于能够以远超人类的速度和规模处理信息,实现高频交易与策略的多样化部署。在金融科技领域,其典型应用场景包括量化投资、套利和风险管理。随着AI代理(AI Agent)技术的融入,系统具备了自主感知、决策与学习的能力,这不仅带来了交易量的指数级增长潜力,也引入了前所未有的安全挑战。本文聚焦于构建一个具备‘Agent OS’雏形的AI代理交易系统,深入探讨其技术栈实现、潜在漏洞及防御策略,特别

weixin_30607659的博客 456

DTD 约束—— Xml文档 约束技术 学习笔记

本文查阅方法: 1、查阅目录 —— 查阅本文目录,确定想要查阅的目录标题 2、快捷“查找” —— 在当前浏览器页面,按键 “Ctrl+F” 按键组合,开启浏览器的查找功能,在查找搜索框中 输入需要查阅的 目录标题,便可以直接到达 标题内容 的位置。 3、学习小结 —— 文中的学习小结内容,是笔者在学习之后总结出的,开发时可直接参考其进行应用开发的...

weixin_34262482的博客 132

11Java基础加强-4. xml文档约束(dtd,schema)

11Java基础加强-4. xml文档约束(dtd,schema)*

学无止境 466

DTD约束 —— Xml文档 约束技术 学习笔记

本文查阅方法:    1、查阅目录 —— 查阅本文目录,确定想要查阅的目录标题    2、快捷“查找” —— 在当前浏览器页面,按键 “Ctrl+F” 按键组合,开启浏览器的查找功能,             在查找搜索框中 输入需要查阅的 目录标题,便可以直接到达 标题内容 的位置。    3、学习小结 —— 文中的学习小结内容,是笔者在学习之后总结出的,开发时可直接参考其进行应用开发的内容...

Even2012的专栏 299

DTD约束 —— Xml文档 约束技术 学习笔记

2019独角兽企业重金招聘Python工程师标准>>> ...

weixin_33941350的博客 99

xml的约束文档,dtd

dtd

yangshenhuai的专栏 522

【Java寒假打卡】Java基础-XML文件的文档约束DTD

【Java寒假打卡】Java基础-XML文件的文档约束DTD

qq_44653420的博客 289

XML约束文档DTD

Tip:XML约束概述 什么是XML约束 在XML技术里,可以编写一个文档来约束一个XML文档的书写规范,这称之为XML约束。 为什么需要XML约束 常用的约束技术 XML DTD  XML Schema Tip:DTD约束快束入门 DTD(Document Type Definition),全称为文档类型定义。 文件清单:book.dtd &lt;!ELEMENT 书架 (书+)...

weixin_34242509的博客 163

XML文档约束之——文档类型定义DTD

文档类型定义(DTD):是一种将约束置于XML文档上的方法。 一个DTD例子 &lt;?xml version="1.0" encoding="UTF-8"?&gt; &lt;!DOCTYPE games[ &lt;!ELEMENT games (game*)&gt; &lt;!ELEMENT game (#PCDATE)&gt; ]&gt; &lt;games&gt;

laopolu的专栏 269
上一篇: JAVA RMI分布式原理和应用
下一篇: XML文档约束之Schema
心如止水dy
博客等级 码龄19年 5粉丝 16原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值