• XML DTD详解


     

    XML DTD详解

     

    前情提要与本文内容介绍

      前面的两篇XML相关博文:

      第一篇是介绍格式正规的XML: 格式正规的XML:语法 属性 实体 处理指令 样式单 CDATA节

      第二篇介绍DTD,引入有效的XML的概念(符合语法规范并符合DTD要求),并介绍DTD的三种使用方法:有效的XML: DTD(文档类型定义)介绍与三种使用方式

      一个有效的XML文档必然是结构正规的,结构正规的XML文档不一定是有效的,即有效的是格式正规的一个子集。

      本文详细介绍DTD,包括其对元素的定义,属性的定义,以及实体的定义。

    元素的定义

    DTD中的修饰符号:

       

      这部分符号可以联系正则表达式的符号来记忆。

     

    属性的定义

        

    属性类型——CDATA

      比如:

    <!ATTLIST title name CDATA #REQUIRED>

      定义了一个属性,是属于title元素的,属性名叫name,类型是字符串(包括数字和中文),并且是一个必须要有的属性。

     

    属性类型——NMTOKEN/NMTOKENS

        

      左边图中因为加了空格而出错。

     

    属性类型——ID

      类型为ID的属性取值必须是唯一的。

     

      从这个例子还可以看到同一个元素可以一次定义多个属性,多个属性之间用空格分隔即可。

     

    属性类型——IDREF/IDREFS

     

                                            (“儿子”后面漏掉了一个斜线)

    属性类型——Enumerated

      实现定义好一些值,属性的值必须在所列出的值的范围内。

        

    属性的特点

    #REQUIRED

      元素的所有实例都必须有该属性的值(NOT NULL)。

      语法:

    <!ATTLIST 元素名 属性名 属性类型 #REQUIRED>

      DTD示例:

    <!ATTLIST person number CDATA #REQUIRED>

      XML示例:

    <person number="6788"/>

    #IMPLIED

      元素的实例中可以忽略该属性(NULL)。

      语法:

    <!ATTLIST 元素名 属性名 属性类型 #IMPLIED>

      DTD示例:

    <!ATTLIST contact fax CDATA #IMPLIED>

      XML示例:

    <contact fax="888-228833"/>

      没有这个属性也是对的。

    #FIXED value

      元素实例中该属性的值必须为指定的固定值。

      语法:

    <!ATTLIST 元素名 属性名 属性类型 #FIXED "value">

      DTD示例:

    <!ATTLIST sender company CDATA #FIXED "Microsoft">

      XML示例:

    <sender company="Microsoft"/>

    Default value

      为属性提供一个默认的值。

      语法:

    <!ATTLIST 元素名 属性名 属性类型 "value">

      DTD示例:

    <!ATTLIST hello paymenttype CDATA "check">

      XML示例:

    <hello paymenttype="check"/>

    定义实体

    一般

      语法:

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

      DTD示例:

    <!ENTITY writer "Donald Duck">
    
    <!ENTITY copyright "Copyright W3Schools">

      XML示例:

    <author>&writer;&copyright;</author>

    外部实体:

      语法:

    <!ENTITY 实体名 SYSTEM "URI/URL">

      DTD示例:

    <!ENTITY writer SYSTEM "http://www.baidu.com/index.php?tn=coralqq">
    
    <!ENTITY copyright SYSTEM "http://www.baidu.com/index.php?tn=coralqq">

      XML示例:

    <author>&writer;&copyright;</author>

      与上面的区别就是加上了SYSTEM关键字。

      这样就不是使用网址的字符串来代替,而是用网址的文档本身内容。

    实体类型

     

      前面所讲的都是普通实体,分为内部实体和外部实体。

     

      所谓参数实体,该实体实际上不是在具体实例化文档中使用,而是在DTD文档内部被使用。

      我们可以定义一个实体,然后在DTD内部来引用它。

      如下:

    <!ENTITY %地址 "街道,城市,邮编,国家">
    
    <!ELEMENT 联系人 (人名,电话,%地址;)>

      

    总结如下:

      普通实体:DTD中定义,XML中使用,使用格式: &名;

      参数实体:DTD中定义,定义的时候要用%,DTD中使用,使用格式: %名;

      普通实体和参数实体都分为内部实体外部实体两种,外部实体定义需要加上SYSTEM关键字,其内容是URL所指向的外部文件实际的内容。

      如果不加SYSTEM关键字,则为内部实体,表示实体指代内容为字符串。

     

     

    参考资料

      圣思园张龙老师视频教程。

  • 相关阅读:
    Python笔记_第一篇_面向过程_第一部分_5.Python数据类型之字符串类型(string)
    每天一杯C_Visual Studio各个版本的区别和总结
    Python笔记_第一篇_面向过程_第一部分_5.Python数据类型之数字类型(number)
    Python笔记_第一篇_面向过程_第一部分_3.进制、位运算、编码
    Valid Number @python
    正式进驻博客园
    LCT总结
    LCT总结
    bzoj3229 [Sdoi2008]石子合并(非dp的GarsiaWachs算法)
    bzoj3229 [Sdoi2008]石子合并(非dp的GarsiaWachs算法)
  • 原文地址:https://www.cnblogs.com/mengdd/p/3107361.html
Copyright © 2020-2023  润新知