无废话XML--XML约束(DTD)
- 基本术语
一、序言Prolog:包括XML声明(XML Declaration)和文档类型声明(Document Type Declaration)。
二、良构(well-formed 规范的):符合W3C定义的XML文档。
- 为什么XML需要验证?
对XML文件施加额外的约束,以便交流。举个例子:要是我和你在交互一份数据,那么按照我的主管意识我可能会这样子定义,按照你的主观意识你可能会那样子定义,那么我们之间要怎么交互数据呢?没有一个提前规定号的约定来规范我们如何写XML,那么就连这份XML的解析估计都是问题了吧,那还交互个毛线呀。
XML有2种约束:1,DTD 2,schema。
- DTD验证
文档类型定义(Document Type Definition)。 DTD定义了XML文档内容的结构,保证XML以一致的格式存储数据。精确的定义词汇表,对XML的内容施加约束。 符合DTD的规范XML文档称为有效的文档。由DTD定义的词汇表以及文档语法,XML解析器可以检查XML文档内容的有效性。 规范的XML文件不一定是有效的;有效的一定是规范的。
1、 DTD声明
1) DTD声明可以在单独的一个文件中
2) DTD声明可以内嵌在XML文件中
3) DTD声明可以一部分在单独的文件中,另一部分内嵌在XML文件中
2、 引入外部DTD文件。DOCTYPE有2种情况:
1),当引用的文件在本地时:
<!DOCTYPE 根节点名称 SYSTEM "dtd文件路径">
2),当引用的文件是一个公共的文件时:实际中这种情况比较多见的。
<!DOCTYPE 根节点名称 public "DTD名称" "DTD文件的URL">
比如我们在写一个JSP,前面都有这个文档定义的。
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
3、 DTD四种标记声明 元素(ELEMENT)、属性(ATTLIST)、实体(ENTITY)、符号(NOTATION)
1) 元素(ELEMENT) XML元素类型声明
声明元素: <!ELEMENT elementName (contentModel)>
元素的内容通过内容模式来描述。
DTD 内容模式的种类有:
EMPTY 元素不能包含任何数据,但可以有属性(前提是必须声明其属性)。
不能有子元素。不能有文本数据(包括空白,换行符)。
DTD中定义: <!ELEMENT elementName EMPTY>
XML中:<elementName/>(推荐) 或者:<elementName></elementName>
(#PCDATA) 规定元素只包含已析的字符数据,而不包含任何类型的子元素的内容类型。
DTD中定义: <!ELEMENT student (#PCDATA)>
XML中合法内容: <student>watching TV</student>
(Elements) 元素由内容模式部件指定。
<!ELEMENT name (child particles) >
内容模式部件可以是下表列出的内容。
<!ELEMENT name (a,b)> 子元素a、b必须出现,且按照列表的顺序
<!ELEMENT name (a|b)> 选择;子元素a、b只能出现一个
<!ELEMENT name (a) > 子元素a只能且必须出现一次
<!ELEMENT name (a)+ > 子元素a出现一次或多次
<!ELEMENT name (a)* > 子元素a出现任意次(包括零次、一次及多次)
<!ELEMENT name (a)? > 子元素a出现一次或不出现
Mixed 混合模式:子元素中既可有文本数据又可有下级子元素。
<!ELEMENT rn (#PCDATA| an | en)*>“|”和“*”必须写。
上句表示在 rn 内,字符数据 或 en及an 可以出现任意多次,顺序不限。
优先写(#PCDATA) 如:(#PCDATA|name)* 正确 (name|#PCDATA)* 错误
ANY 元素可以包含任何类型的数据。子元素(必须在DTD中有定义) 和 文本数据(包括空白)。
DTD中定义: <!ELEMENT a ANY> <!ELEMENT b ANY>
XML中合法内容: <a>somngthing</a> 或者 <a/> 或者 <a><b>oo</b></a>
2) 属性(ATTLIST) 特定元素类型可设置的属性&属性的允许值声明
<!ATTLIST elementName
attributeName1 attributeType attributeDefault
.......
attributeNameN attributeType attributeDefault>
属性类型 (Attribute Type):
CDATA该属性只能包含字符数据(注意与CDATA段、PCDATA的区别)
NMTOKEN 是CDATA的子集,它的字符只能是字母,数字,句点,破折号,下划线或冒号。
NMTOKENS 类似NMTOKEN,但这个可以包含多个值,每个值之间用空格隔开。
ID 该属性的取值在同一文档内是唯一的。一个元素只能有一个ID类型的属性。
IDREF 类似指针,指向文档中其他地方声明的ID值。如果该属性取值和指向的ID值不匹配,则返回错误。
IDREFS 类似IDREF,但它可以具有由空格分隔开的多个引用。
ENTITY 该属性的值必须对应一个在文档内部声明的但还没有分析过的实体。
ENTITYS 类似ENTITY,但它可以包含由空格分隔开的多个实体。
NOTATION 该属性的值必须引用在文档中其他地方声明的某个注释的名称。
(enumerated) 类似枚举的变量,该属性必须匹配所列的值。各值用“|”分隔开。
如: (春|夏|秋|冬) 实际内容文档只能从中取一个。
属性特性 (Attribute Default) :
#REQUIRED 必须有且只能有一个属性。
#IMPLIED 可有可无。
#FIXED 在DTD中定义默认值,XML中可以不指定,指定则必须等于该默认值。
attribute-value 如果不指定则用DTD定义的默认值,指定则用指定的值。
<![CDATA[############ 属性(ATTLIST)的举例 ############## ]]>
例一(#REQUIRED)
DTD中: <!ELEMENT el (#PCDATA)> <!ATTLIST el at1 NMTOKENS #REQUIRED at2 CDATA #REQUIRED>
XML中,正确: <el at1 = "10 20" at2="10" >something</el>
XML中,错误: <el at="10">something</el> (没有写另一个#REQUIRED的属性 at2 )
例二(#IMPLIED,#FIXED)
DTD中: <!ELEMENT el (#PCDATA)> <!ATTLIST el at CDATA #FIXED "10" at2 CDATA #IMPLIED >
XML中,正确: <el at2="20" >something</el> (at有默认值"10",at2 可写可不写)
XML中,错误: <el at="11" >something</el>(at要么不写,要写只能写成跟默认值相同的)
例三(attribute-value)
DTD中:<!ELEMENT el (#PCDATA)> <!ATTLIST el at CDATA "10" at2 CDATA "20" >
XML中,正确: <el at="11" >something</el>
例四(enumerated + attribute-value)
DTD中:<!ELEMENT el (#PCDATA)> <!ATTLIST el at (10|20|30) "10">
XML中,正确: <el at="20">something</el> (at要么不写,默认值 10;要么在(10|20|30)中选一个写)
<![CDATA[############ 属性(ATTLIST)举例 完毕 ############## ]]>
3) 实体(ENTITY) 可重用的内容声明
在DTD中定义 <!ENTITY 实体标志 "实体内容">
在xml中引用自定义的实体,用 &实体标志; 代表实体内容。
4) 符号(NOTATION) 不要解析的外部内容的格式声明。
3、 内部实体:在xml文件里面写(少用)。 外部实体:另外在xml同一文件夹下建立一个dtd文件(提倡)
外部的:以下是XML:
<?xml version="1.0" encoding="UTF-8" standalone="no"?><!DOCTYPE root SYSTEM "goodsInfo.dtd"><!--用这句引用外部dtd--><root><goodsInfo><goodsName>goodsName</goodsName><goodsPrice>goodsPrice</goodsPrice></goodsInfo></root>
以下是名为"goodsInfo.dtd"文件:
<!ELEMENT root (goodsInfo)><!ELEMENT goodsInfo (goodsName,goodsPrice)><!ELEMENT goodsName (#PCDATA)><!ELEMENT goodsPrice (#PCDATA)>
内部的:
<?xml version="1.0"?><!DOCTYPE root [<!ELEMENT root(student)><!ELEMENT student (#PCDATA)><!ENTITY CCTV "中央电视台">]> <!--把DTD文件写在体内--><root><student>student watch &CCTV;<!--使用自定义实体 CCTV--></student></root>
转载于:https://www.cnblogs.com/LinkinPark/p/5233115.html
无废话XML--XML约束(DTD)相关推荐
- xml教程之dtd约束
1.dtd作用 XML都是用户自定义的标签,若出现小小的错误,软件程序将不能正确地获取文件中的内容而报错.(如:Tomcat) XML技术中,可以编写一个文档来约束一个XML的书写规范,这个文档称之为 ...
- XML的约两种约束——DTD、Schema
在XML技术里,可以编写一个文档来约束一个XML文档的书写规范,这称之为XML约束. 常用的约束技术XML DTD :XML Schema. XML Schema 也是一种用于定义和描述 XML 文档 ...
- 无废话xml下载_废话之盾
无废话xml下载 可用性的力量 马克斯·范·德·沃夫(Max Van der Werff) Elvis Bekmanis在Unsplash上的照片 在软件方面,用户体验(尤其应该是用户体验)非常受关注 ...
- 无废话xml下载_建立您自己的网站作为完整的初学者,没有废话
无废话xml下载 I have always wanted to blog and have my own website and I finally did! It feels so good! 我 ...
- 【日常学习】XML文件约束,Tomcat服务器和HTTP协议
文章目录 XML文件约束,Tomcat服务器和HTTP协议 1. XML文件约束[了解] 1.1 约束方式 1.2 DTD约束 1.3 Schema 2. Tomcat服务器 2.1 JavaWEB服 ...
- idea xml文件引入类提示_IntelliJ IDEA:引用XML模式和DTD
引用XML模式和DTD 您的XML文件可能引用外部XML架构(XSD)或DTD文件,例如 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instan ...
- javaweb实训第五天下午——xml配置文件约束报错问题
spring框架中xml配置文件约束报错问题 问题描述: 问题描述: 如果电脑连不上网,或者网速不好可能会造成Spring框架中xml配置文件出现错误.但是这个错误不影响项目的运行的: <bea ...
- XML shema 约束入门 (2 ) 约束文件加入与说明
复合元素 book.xsd <?xml version="1.0" encoding="UTF-8" ?> <schema xmlns=&qu ...
- XML——XML Schema
[0]README 0.0)本文文字描述转自 core java volume 2 , 旨在理解 XML--XML Schema 的基础知识 :(本文不涉及源代码, 很遗憾,以后会补充) [1]XML ...
- XML - XML学习/XML文件解析器(C++)实现
XML - XML学习/XML文件解析器(C++)实现 XML概述 XML是一套定义语义标记的规则,这些标记将文档分成许多部件并对这些部件加以标识.它也是元标记语言,用于定义其他与特定领域有关的, ...
最新文章
- 4、Eternal框架-持有者
- [云炬创业基础笔记]第五章创业机会评估测试4
- 【CyberSecurityLearning 76】DC系列之DC-7渗透测试(Drupal)
- 文本分类-TensorRT优化结果对比图
- 关于 std::set/std::map 的几个为什么
- 所有和Java中代理有关的知识点都在这了。
- 触控屏c语言程序,TouchWin编程软件下载_TouchWin触摸屏软件下载 2.D.2c 官网版_当载软件站...
- 控制层@Value注解取不到值
- C# 创建Excel文件
- destoon的如何显示tag生成的sql语句
- python监控网页状态
- 韩国专家深度剖析DT时代的精髓
- 自增、主键的优缺点(数据库)
- [转自华尔街的强帖]怎样才能嫁给有钱人
- python控制键盘游戏内无效_关于python的游戏《兔子和獾》代码写到用键盘输入WASD控制兔子移动时,兔子移动不了。但是。。。...
- 112358序列c语言,112358(112358的规律是什么)
- Maven系列学习(2)——java project的创建
- 信客 lt;文gt; 余秋雨
- 什么是产生式知识表示?给出这种表示方法的有缺点?
- 记一次加湿器购买经历
热门文章
- Ubuntu下安装 imagej 和 Fiji
- 第97:一文读懂协方差与协方差矩阵
- .net core WebApi 使用Swagger生成API文档
- xxx征集系统项目目标文档
- 到天宫做客(2017寒假培训测试压轴题)
- window linux IPC ftok BY_HANDLE_FILE_INFORMATION
- [C++] Nested Radical Constant
- C语言中,宏和全局变量的区别是什么?
- python和django中的常见错误
- CMFCRibbonStatusBar中添加图片按钮