• 基本术语

    一、序言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>

无废话XML--XML约束(DTD)的更多相关文章

  1. XML的约束(dtd)

    DTD(Document Type Definition),文档类型定义,DTD文件应使用UTF-8或Unicode   1.XML中有多少个元素,就在dtd文件中写几个 <!ELEMENT&g ...

  2. XML(二)之DTD——XML文件约束

    前面介绍了XML的作用和基本的格式,今天我给大家分享的是关于XML的约束.废话不多说,我们直接来正题! 一.DTD简介 1.1.DTD概述 DTD(Document Type Definition,文 ...

  3. xml语法、DTD约束xml、Schema约束xml、DOM解析xml

    今日大纲 1.什么是xml.xml的作用 2.xml的语法 3.DTD约束xml 4.Schema约束xml 5.DOM解析xml 1.什么是xml.xml的作用 1.1.xml介绍 在前面学习的ht ...

  4. javaweb学习总结八(xml约束DTD)

    一:XML约束概念 xml约束:可以编写一个文档来约束xml文件的书写规范. xml语言格式比较严谨,不可能让程序员随意编写,所以必须要有约束. 二:常用的xml约束技术 1:DTD,document ...

  5. 16.XML语法、CDATA、约束(DTD、Schema)讲解

    xml主要用来描述数据,比如配置文件,网络之间传输数据等,并且在android中也经常用xml来布局,,接下来便来学习xml常用的东西 1.XML语法 xml语法分为: 1.1 文档声明 必须位于文档 ...

  6. XML约束DTD

    <元素1> <元素2> <元素3>描述1</元素3> <元素4>描述2</元素4> </元素2> </元素1& ...

  7. xml约束DTD演示

    此演示xml和DTD在一个文件中 book.xml <?xml version="1.0" encoding="utf-8"?> <!DOCT ...

  8. JavaBean 内省API BeanUtils工具 泛型 xml xml约束

    1 什么是JavaBean?有何特征? 1)符合特定规则的类    2)JavaBean分二类:     a)侠义的JavaBean         .私有的字段(Field)         .对私 ...

  9. XML中的DTD语法

    DTD(Document Type Definition),全称为文档类型定义. 文件清单:book.xml <?xml version="1.0" ?> <!D ...

  10. XML文件定义约束

    今天在做Android项目的时候,用到了XML解析,服务端返回的不是JSON,而是XML,这时候就需要我们解析XML了,当然在解析XML的时候,需要了XML文件的定义结构,任何一个文件的定义都是要遵循 ...

随机推荐

  1. OTCBTC上线币币交易

    我们在这里很高兴的宣布,OTCBTC 的币币交易区,即将在 2018/01/11 于 08:00 上线. 这个币币交易区,将会跟所有现有的交易所很不一样,我们将开放用户自主上币,且所有品种不收任何上架 ...

  2. 关于OC中浮点型的计算

    有时候不得不承认,细心观察生活中的细节,有时候会得到很多. 今天和公司朋友一起订了外卖,因为要分账,就突发奇想用代码来算出每个人花了多少钱.最后发现以前没有注意的细节或者不知道的知识,记录下. 我的代 ...

  3. webgl鱼眼算法

    在网页上面实现,采用的是球面映射和材质线性映射,这里注意的是用线性映射保留了球面的感觉,而不是采用sin映射,sin映射在边缘会产生很难看的效果. 最后效果如下:

  4. poi 读取word文档

    1.导入jar包 官网下载地址: https://www.apache.org/dyn/closer.lua/poi/release/bin/poi-bin-3.17-20170915.zip 最开始 ...

  5. HTML知识点之表示强调的主要元素

    <h1>~<h6> 在HTML中,标题(Heading)元素共有6个级别的标签:<h1>~<h6>.它们都是块级元素.标题数字越小,字体就会越大,标题的 ...

  6. ARM非对齐操作异常解决过程

    在测试MF固件时,发生一个非常诡异的异常,代码如下: CLR_DBG_Commands::Monitor_EraseMemory* cmd = (CLR_DBG_Commands::Monitor_E ...

  7. Zabbix实战-简易教程--监控OSPF

    一.需求背景 网络工程师需要对OSPF进行监控,需求如下: 1.状态展示 OSPF区域状态 OSPF接口状态 OSPF邻居状态 2.问题报警 触发器设置: a.OSPF区域状态  b.OSPF接口状态 ...

  8. js各种继承方式汇总

    js中的各种继承实现汇总 首先定义一个父类: function Animal(name) { this.name = name || '动物' this.sleep = function () { c ...

  9. windows c++程序移植到linux的要点

    这段时间得到一份源码,是Windows下的,调试了一把,可以正常运行,可是没有Linux版本,而实际的应用场景是要在Linux服务器上面运行 所以涉及到Windows下c++程序的移植,有同事竭力推荐 ...

  10. Python 之 基础知识(一)

    首先,对于初学者在一个项目中设置多个程序可以执行,是非常方便的,可以方便对不同知识点的练习和测试 对于商业项目而言,通常在一个项目中,只有一个可以执行的Python程序 一.注释 为了提高可读性,注释 ...