• 【万能的数据传输格式XML入门教程】三、DTD约束


    1. 为什么需要DTD约束

    2. 什么是DTD约束文档

    DTD:Document Type Definition (文档类型定义)

    主要功能:约束XML的书写规范

    XML技术中,可以编写一个文档来约束一个XML的书写规范,这个文档称之为约束约束文档定义了在XML中允许出现的元素名称、属性及元素出现的顺序等等。

    格式良好的XML(合法的XML):遵循XML语法的XML(满足XML详解中的七要素)

    有效的XML(合理的XML):遵循DTD约束文档的XML

    合理的XML文档一定是合法的XML文档,但是合法的XML文档不一定是合理的XML文档。

    3. 快速入门

    <?xml version="1.0" encoding="UTF-8"?>
    <!DOCTYPE team [
        <!ELEMENT team (person+)>
        <!ELEMENT person (name,age,email)>
        <!ELEMENT name %PCDATA;>
        <!ELEMENT age %PCDATA;>
        <!ELEMENT email %PCDATA;>
    ]>
    <team>
        <person>
            <name>吕布</name>
            <age>36</age>
            <email>lvbu@163.com</email>
        </person>
        <person>
            <name>貂蝉</name>
            <age>18</age>
            <email>xiaodiao@126.com</email>
        </person>
    </team>

    4. DTD约束文档分类

    (1)内部DTD

    内部DTD是编写在XML文档中的DTD约束。

    基本语法:

    <!DOCTYPE   根元素 [
        //DTD约束
    ]>

    编写DTD约束的小技巧:从上往下依次编写

    DTD语法

    <!ELEMENT 元素名 元素类型>

    (2)外部DTD

    如果DTD约束文档独立于XML文档,我们把这种文档就称之为外部DTD

    基本语法:

    <!DOCTYPE 根元素名 SYSTEM "外部DTD的URI">

    xml:

    <?xml version="1.0" encoding="UTF-8"?>
    <!DOCTYPE team SYSTEM "demo06.dtd">
    <team>
        <person>
            <name>吕布</name>
            <age>36</age>
            <email>lvbu@163.com</email>
        </person>
        <person>
            <name>貂蝉</name>
            <age>18</age>
            <email>xiaodiao@126.com</email>
        </person>
    </team>

    demo.dtd:

    <!ELEMENT team (person+)>
    <!ELEMENT person (name,age,email)>
    <!ELEMENT name #PCDATA;>
    <!ELEMENT age #PCDATA;>
    <!ELEMENT email #PCDATA;>

    (3)公用DTD

    公用DTD主要是由第三方权威机构(W3C)编写,所有文档都必须遵循的一种约束文档

    基本语法:

    <!DOCTYPE 根元素 PUBLIC "DTD标识名" "公用DTD的URI">

    5. DTD约束详解

    • 定义元素
    • 定义属性
    • 定义实体

    (1)定义元素

    <!ELEMENT 元素名称 元素类型>

    主要功能:定义元素出现的名称、顺序、出现的次数...

    元素 说明
    (#PCDATA) 该类型可包含任何字符数据,但是不能包含任何子元素
    EMPTY 该类型不能包含子元素和文本,但可以有属性
    ANY 该类型可以包含任何在DTD定义的元素内容(常用于根元素)

    (子元素) :定义子元素只能出现一次

    (子元素1,子元素2,...) :定义子元素只能出现一次且顺序不能改变

    (子元素*) :定义子元素出现的次数为0或多

    (子元素+) :定义子元素出现的次数为1或多

    (子元素?) :定义子元素出现的次数为0或1

    (子元素1|子元素2) :互斥元素

    (2)定义属性

    <!ATTLIST 元素名称 属性名称 属性类型 默认值>

    主要功能:定义元素的属性类型与默认值

    属性 说明
    CDATA 字符或数字(文本类型)
    (en1|en2|...) 枚举类型(多选一)
    ID 属性唯一 要求属性必须是唯一的
    IDREF 引用 引入已定义的ID属性
    默认值 说明
    #REQUIRED 必填
    #IMPLIED 可选
    #FIXED 固定值,有值且值是固定的
    默认值,有值且值是可选的

    例1:CDATA与#REQUIRED

    例2:枚举类型与#IMPLIED

    例3:ID属性与#REQUIRED

    例4:IDREF引用类型(引入已定义的ID类型)

    例5:#FIXED与值区别

    #FIXED固定值

    值 默认值

    6. 定义实体

    为一段内容起一个别名,然后在文档中可以通过引用别名来实现对这段内容的引用,我们把这种情况就称之为“实体”(功能类似于PHP中的变量)

    (1)引用实体

    定义语法:

    <!ENTITY 实体名称 "实体的值">

    引用语法:

    &实体名; &lt; &gt; &copy; &nbsp;

    注:只能内部DTD中定义,在XML文档使用

    (2)参数实体

    定义语法:

    <!ENTITY % 实体名称 "实体的值">

    引用语法:

    %实体名;

    注:参数实体必须定义在外部DTD中先定义后使用。

    7. 综合实例

    产品目录 DTD:

    详解综合案例:

    (1)阅读第2行代码可知,当前XML文档的根元素为CATELOG。

    (2)阅读第4-6行代码可知,当前系统一共定义了3个实体,分别为AUTHOR/COMPANY/EMAIL

    (3)阅读第8行代码可知,当前系统根元素下具有多个(1或多)个PRODUCT元素

    (4)阅读第10-11行代码可知,当前系统中PRODUCT元素具有4个子元素

    (5)阅读12-17行代码可知,当前系统中PRODUCT元素具有多个可选属性

    (6)阅读19-22行代码可知,当前系统中SPECIFICATIONS规则内具有两个可选属性

    (7)阅读30-35行代码可知,当前系统中PRICE具有4个可选属性

    最终结果:

  • 相关阅读:
    一个接口的性能问题定位和分析过程
    HTTP请求全过程(很全面)
    Linux中查看物理CPU个数、核数、逻辑CPU个数
    linux查看文件大小
    ping不通判断系统是否开机
    ping不通判断系统是否开机
    linux压缩解压文件命令
    python连接redis集群,添加数据
    初学python
    企业级BI为什么这么难做?
  • 原文地址:https://www.cnblogs.com/chenjiacheng/p/6522283.html
Copyright © 2020-2023  润新知