• 无废话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>

  • 相关阅读:
    Pycharm快捷键
    unittest自动化测试框架
    Python简介
    Git工作流介绍
    GitFlow ⼯作流
    go 整分钟开始执行程序
    vue 保留两位小数
    vue 格式化时间戳
    Supervisor-进程守护工具
    为什么计算机语言中的变量名都不能以数字开头呢?
  • 原文地址:https://www.cnblogs.com/LinkinPark/p/5233115.html
Copyright © 2020-2023  润新知