XML约束之DTD

一、概念:类是对象的约束,DTD是对XML文件的约束
二、编写DTD约束的两种方式:
      一】将DTD和XML文件分离
           1>引用本地文件时:SYSTEM---个人或组织,小范围内使用
                    格式:<!DOCTYPE 文档根节点    SYSTEM "DTD文件的URL">

            code:
                        <!DOCTYPE root SYSTEM "class.dtd">


                       
           2>引用公共文件时:PUBLIC----大范围内使用,例如:structs框架
                    格式:<!DOCTYPE 文档根节点    PUBLIC "DTD名称" "DTD文件的URL">
                    eg: 

                  <!DOCTYPE web-app PUBLIC
                                    "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN"
                                    "http://java.sun.com/dtd/web-app_2_3.dtd">


                                                
      二】XML中嵌入DTD
                格式:<!DOCTYPE 文档根节点 [dtd文档内容]>
                eg:
                   

          <!DOCTYPE root[
                        <!ELEMENT root       (student+)>
                        <!ELEMENT student (name, age)>
                        <!ELEMENT name       (#PCDATA)>
                        <!ELEMENT age     (#PCDATA)>
                    ]>


                    
                                    
三、DTD语法
       一】声明XML的元素
            1>格式:<!ELEMENT 元素名称 (元素类型或者元素类型)>
                  EMPTY:用于定义单个标签元素,例如<br/> <hr/>
                   eg:
                            <!ELEMENT alias EMPTY>
                                            ||
                            <alias />
                            
                   ANY:用于表示元素内容为任意类型。【建议少用】
                
             2>语法细节:!!!
                    a.在DTD中,必须要将所有的标签全部都声明完
                    b.内容用“,”分隔,要求XML中的元素顺序必须与此内容相同
                    c.内容中的“|”,代表XML文件内容可以是其中之一
                    d.约束对应内容出现的次数:
                             +:一次或多次
                             ?:0次或1次
                             *:0次或多次
                             没有符号标识:有且只能出现一次。
                    e.也可使用圆括号( )批量设置,例:
                            <!ELEMENT MYFILE ((TITLE*, AUTHOR?, EMAIL)* | COMMENT)>
             3>code: 

                        <!DOCTYPE root[
                             <!ELEMENT root       (student+)>
                             <!ELEMENT student (name, age)>
                             <!ELEMENT name       (#PCDATA)>
                             <!ELEMENT age     (#PCDATA)>
                         ]>
                        
                            <root>
                                <student>
                                    <name>张三</name>
                                    <age>30</age>    
                                </student>
                                <student>
                                    <name>李四</name>
                                    <age>31</age>    
                                </student>
                            </root>
                            


                            
      二】声明XML的属性
            1>格式:
                            <!ATTLIST 元素名
                                    属性名1    属性值类型        设置说明
                                    属性名2    属性值类型        设置说明
                                    属性名3    属性值类型        设置说明
                                    ...
                            >
             2>常用的属性值类型
                        a)CDATA:规定属性值类型为普通文本字符串
                            <!ATTLIST 商品
                                    类别 CDATA    #REQUIRED
                            >
                        b)ENUMERATED:是一组取值的列表,在 XML 文件中设置的属性值只能是这个列表中的某个值
                            eg:
                            <!ATTLIST 肉
                                    品种 ( 鸡肉 | 牛肉 | 猪肉 | 鱼肉 ) "鸡肉"
                            >


                        c)ID:只能以字母和下划线开头
                            eg:
                                <!ATTLIST 联系人
                                        编号 ID #REQUIRED
                                >
                        d)ENTITY:实体类型:为一段内容创建一个别名
                            
         3>属性值设置说明的四种情况
                        a.#REQURIED:该属性必须出现
                        b.#IMPLIED:该属性可有可无
                        c.#FIEXD "固定值":该属性可有可无,但当有该属性的时候,属性值是一个不可改变的固定值,在XML中需要为添加这个属性, 并设为此固定值。
                        d.直接使用默认值:该属性值一个可变的默认值,在XML中可以设置去改变此属性,也可以不设置此属性,自动使用此默认值。
                    
            code:
               

           !DOCTYPE root[
                    <!ELEMENT root (桌子+)>
                    <!ELEMENT 桌子    EMPTY>
                    <!ATTLIST 桌子
                        id             ID            #REQUIRED
                        width        CDATA        #REQUIRED
                        height        (50|60|70)    "60"
                        make        CDATA        #IMPLIED
                        color        CDATA        #FIXED    "白色"
                        weight        CDATA        "20"
                    >
                ]>
                <root>
                    <桌子
                        id="t2011100901"
                        width="60"
                        height="70"
                        color="白色"
                    />
                </root>
                
                <!-- 结果:
                    桌子 id="t2011100901" width="60" height="70" color="白色" weight="20" />
                -->


                        
     三】实体的定义
                    
            1>引用实体【需要内嵌才有效】
                            ---当web页面出现多个相同的字符串时,在XML中引用
                    a.格式
                        定义:    <!ENTITY 实体名称 "实体内容">
                        引用:    &实体名称;
                    
                        eg:
                         

                <!DOCTYPE root[
                                <!ELEMENT root     (电视台+)>
                                <!ELEMENT 电视台  (#PCDATA)>
                                <!ENTITY CCTV    "中国中央电视台">
                            ]>
                            <root>
                                <电视台>
                                    &CCTV;
                                </电视台>
                                <电视台>
                                    &CCTV;
                                </电视台>
                            </root>


                        
              2>参数实体【注意:此时需要将DTD与XML文件分开才有效】
                            ---当web页面出现多个相同子元素的时,在DTD中引用
                    a.格式:
                        定义:    <!ENTITY % 实体名称 "实体内容">
                        引用:    %实体名称;
                        eg:

                           <!ENTITY % TIP    "姓名">
                            <!ELEMENT    root    (客户,员工)>
                            <!ELEMENT     客户        (%TIP;)>
                            <!ELEMENT       员工        (%TIP;)>
                            <!ELEMENT    %TIP;        (#PCDATA)>                        


 四、总结:【重点】
                1》浏览器会对XML和DTD进行语法的检测,但浏览器不会检测XML是否符合DTD规则。
                2》正确的XML文件和有效的XML文件
                        正确的XML文件:语法正确的文件
                        有效的XML文件:语法和约束都正确的文件
                3》检测是否有效需要利用:validate.html的中JS脚本。【工具里面】
               

原文地址:https://www.cnblogs.com/SkyGood/p/3963799.html