zoukankan      html  css  js  c++  java
  • XML(二)之DTD——XML文件约束

    前面介绍了XML的作用和基本的格式,今天我给大家分享的是关于XML的约束。废话不多说,我们直接来正题!

    一、DTD简介

    1.1、DTD概述

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

      1)DTD是一套关于标记符的语法规则。它是XML1.0版规格的一部分,是XML文件的验证机制,属于XML文件组成的一部分
      2)XML文件提供应用程序一个数据交换的格式,DTD正是让XML文件能够成为数据交换的标准,因为不同的公司只需定义好标准的DTD,

        各公司都能够依照DTD建立XML文件,并且进行验证,如此就可以轻易的建立标准和交换数据,这样满足了网络共享和数据交互。
      4)DTD中的所有约束都是针对 与某个标签的子标签进行约束的

      注意:除了DTD约束,其实还有其他的约束。Schema(模式)约束:用xml写的文件,然后用来约束xml文件

    1.2、DTD的目的

      验证XML文档是不是一个有效的XML文档。
      有效:如果一个良构的XML文档满足了dtd的声明,就是一个有效的XML文档。
      有效一定良构,良构不一定有效。

    1.3、XML文档引入DTD的方式

      1)引入内部DTD

      <!DOCTYPE 根元素[
          DTD验证规则/实体定义...
      ]>

      2)引入外部DTD

      当引用的文件在本地时:<!DOCTYPE 根元素 SYSTEM "DTD文件路径">

      当引用文件是一个公共文件(DTD文件存在于远程服务器上)时:<!DOCTYPE 根元素 PUBLIC "DTD名称" "DTD文件的URL">

    1.4、DTD约束原理

      

      注:通过DTD约束,XML就能在DTD的约束下进行自定义了,不过DTD有个缺点,那就是不能对数据进行数值约束这种范围约束。

    二、DTD的分类

    2.1、内部DTD

      DTD代码与XML代码在同一个文件中

      例如:带有DTD的XML文档实例

    <?xml version="1.0"?>
    <!DOCTYPE note [
        <!ELEMENT note (to,from,heading,body)>
        <!ELEMENT to (#PCDATA)>
        <!ELEMENT from (#PCDATA)>
        <!ELEMENT heading (#PCDATA)>
        <!ELEMENT body (#PCDATA)>
    ]>
    <note>
         <to>Tove</to>
         <from>Jani</from>
         <heading>Reminder</heading>
         <body>Don't forget me this weekend</body>
    </note>
    View Code

      分析:    

        !DOCTYPE note (第二行)定义此文档是 note 类型的文档。
        !ELEMENT note (第三行)定义 note 元素有四个元素:"to、from、heading,、body"
        !ELEMENT to (第四行)定义 to 元素为 "#PCDATA" 类型
        !ELEMENT from (第五行)定义 frome 元素为 "#PCDATA" 类型
        !ELEMENT heading (第六行)定义 heading 元素为 "#PCDATA" 类型
        !ELEMENT body (第七行)定义 body 元素为 "#PCDATA" 类型

    2.2、外部DTD

      DTD约束与xml文档不在同一个文件中,XML文档需引入外部DTD文件

      例如:外部DTD实例,需要将DTD文件引入到XML文件中

    <?xml version="1.0"?>
    <!DOCTYPE note SYSTEM "note.dtd">
        <note>
            <to>Tove</to>
            <from>Jani</from>
            <heading>Reminder</heading>
            <body>Don't forget me this weekend!</body>
        </note>
    View Code

      note.dtd文件的内容

    <!ELEMENT note (to,from,heading,body)>
    <!ELEMENT to (#PCDATA)>
    <!ELEMENT from (#PCDATA)>
    <!ELEMENT heading (#PCDATA)>
    <!ELEMENT body (#PCDATA)>
    View Code

    2.3、混合DTD

      既有外部DTD,又有内部DTD  

    三、DTD在元素中的声明

    3.1、元素约束

      格式:<!ELEMENT 元素名 (内容模式)> 同一元素不允许出现两次声明

      1)内容模式:可以对元素内容进行约束也可以对元素中的子元素进行约束,大小写敏感,内容模式的括号有意义

        1.1)(#PCDATA) :元素内容为任何字符或者空,但不允许有子元素, 不可省略()

        1.2)EMPTY :元素内容为空,不允许有任何文本数据(包括空格换行)与子元素,可以有属性,不可加()
        1.3)ANY :元素可以包含任何数据,包括文本数据和子元素,不可加()

        <!--1.EMPTY:指的是该标签中不能有其他任何的子标签-->
        <!-- <!ELEMENT students EMPTY> -->
            
        <!-- 2.(#PCDATA:表示在该标签中只能出现字符内容,不能出现任何的标签) -->
        <!-- <!ELEMENT students (#PCDATA)> -->
        
        <!--3.ANY:表示在该标签中可以出现任何数据  -->
        <!-- <!ELEMENT students ANY> -->
    <students>
    </students>
    View Code

        1.4)(childElements) 由内容模式部件指定:“, | ? + *”

          对内部子元素进行约束,均不能添加其他子元素以及文本(可以空格换行)

          “,”:表示指定子元素必须顺序出现,不多不少
            例如:<!ELEMENT EleName (a,b,c)>
            解读:<!-- 表示a、b、c三个元素按照顺序并且每个只能出现一次 -->
          “|”:表示在指定的多个子元素中选择出现1个,只能1次
            例如:<!ELEMENT EleName (a|b|c)>
            解读:<!-- 表示a、b、c三个元素任选其一只能出现一次 -->
          “ ”:元素必须且只能出现一次
            例如:<!ELEMENT EleName (a)>
            解读:<!-- 表示a必须出现并且只能出现一次 -->
          “?”:指定元素要出现0次或1次
            例如:<!ELEMENT EleName (a)?>
            解读:<!-- 表示a能够出现0次或1次 -->
          “+”:指定元素要出现1次或多次
            例如:<!ELEMENT EleName (a)+>
            解读:<!-- 表示a能够出现1次或多次 -->
          “*”:指定元素要出现0次或多次
            例如:<!ELEMENT EleName (a)*>
            解读:<!-- 表示a能够出现0次或多次 -->

      2)混合模式(Mixed)

        元素中既可有文本数据又可有子元素

        <!ELEMENT EleName (#PCDATA|a|b)*>
        表示元素中即可以有字符又可以有指定元素,字符数据与指定元素可以出现任意次数,顺序不限。
      注意:优先写#PCDATA,如(#PCDATA|a)*正确,(a|#PCDATA)*错误。
           浏览器是非验证解析器,不会校验xml文档的有效性。

    3.2、属性约束

       1)语法:

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

       2)属性类型

        ID 属性值唯一,且属性值必须符合命名规则——不能以数字开头
        (v1|v2|v3) 枚举,属性值从中选择一个
        CDATA 属性值为字符

      3)属性默认值

        #REQUIRED 属性必须出现,属性值没有限制
        #IMPLIED 属性值可以出现可以不出现
        attribute_vlaue 属性类型后跟属性值,表示属性如果不出现,则属性值为默认的attribute_value
        #FIXED value #FIXED value表示属性可出现可不出现,显示出现则属性值必须为指定的value,不出现,则值默认value

      注:ID属性类型只能使用#REQUIRED或#IMPLIED;枚举类型后跟默认值必须为匹配值之一      

    四、DTD文档的实例

    4.1、内嵌

    <!DOCTYPE  根元素[
        <!ENTITY 实体名 "实体内容">
        <!ELEMENT 元素名 (内部模式)>   
         <!ATTLIST 元素名 属性名 属性类型 属性默认值/属性特点
            属性名 属性类型 属性默认值/属性特点
            ...
        >
    ]>
    View Code

    4.2、外部引用

    <!DOCTYPE 根元素 SYSTEM "dtd文件路径">
    <!DOCTYPE 根元素 PUBLIC "dtd文件的描述信息" "dtd的url">
    View Code

    4.3、内嵌与外部引用同时使用

    <!DOCTYPE 根元素 SYSTEM "dtd文件路径" [
        <!ENTITY 实体名 "实体内容">
        <!ELEMENT 元素名 (内部模式)>
        <!ATTLIST 元素名 属性名 属性类型 属性默认值
            属性名 属性类型 属性默认值
            ...
        >
    ]>
    View Code

    一个实例:班级约束

      XMLClass.dtd

    <!ENTITY % sex "男|女">  
    <!ELEMENT 班级 (学生+,作者)>  
    <!ATTLIST 班级  
        班次 CDATA "1班"  
        编号 ID #REQUIRED  
    >  
    <!ELEMENT 学生 (名字,年龄,介绍)>  
    <!ELEMENT 作者 (#PCDATA)>  
    <!ATTLIST 学生  
        地址 CDATA #IMPLIED  
        授课方式 CDATA #FIXED "面授"  
        学号 ID #REQUIRED  
        班级编号 IDREF #REQUIRED  
        朋友 IDREFS #IMPLIED  
        性别 (%sex;) #REQUIRED  
    >  
    <!ELEMENT 名字 (#PCDATA)>  
    <!ELEMENT 年龄 (#PCDATA)>  
    <!ELEMENT 介绍 (#PCDATA)> 
    XMLClass.dtd

      XMLtest.xml

    <?xml version="1.0" encoding="UTF-8"?>  
    <!-- 引入DTD -->  
    <!DOCTYPE 班级 SYSTEM "XMLClass.dtd"  
    [<!ENTITY writer "Switch">]>  
    <班级 编号="C1" 班次="1班">  
        <学生  地址="湖南" 授课方式="面授" 学号="n1" 班级编号="C1" 朋友="n2" 性别="">  
            <名字>张三</名字>  
            <年龄>20</年龄>  
            <介绍>不错</介绍>  
        </学生>  
        <学生 授课方式="面授" 学号="n2" 班级编号="C1" 朋友="n1 n3" 性别="">  
            <名字>李四</名字>  
            <年龄>18</年龄>  
            <介绍>很好</介绍>  
        </学生>  
        <学生 授课方式="面授" 学号="n3" 班级编号="C1" 朋友="n2" 性别="">  
            <名字>王五</名字>  
            <年龄>22</年龄>  
            <介绍>非常好</介绍>  
        </学生>  
        <作者>&writer;</作者>  
    </班级>
    View Code

       

    觉得不错的点个推荐“”哦!

  • 相关阅读:
    为富人服务,挣富人的钱 Leone
    javascript 高效数组随机顺序 Leone
    Atitit 开发2d游戏的技术选型attilax总结
    Atitit 软件项目非法模块与功能的管理与  监狱管理的对比 原理与概论attilax总结
    qqzoneQQ空间漏洞扫描器的设计attilax总结
    Atitit机器学习原理与概论book attilax总结
    Atiti  qq空间破解(3)gui图形化通用cli执行器atiuse
    Atitit.attilax重要案例 项目与解决方案与成果 v6 qa15
    Atitit dsl对于数组的处理以及main函数的参数赋值
    Atitit 类库冲突解决方案  httpclient4.5.2.jar
  • 原文地址:https://www.cnblogs.com/zhangyinhua/p/7586853.html
Copyright © 2011-2022 走看看