【通用】文档类型定义(DTD)
    文档类型定义(DTD):可定义合法的XML文档构建模块。它使用一系列合法的元素来定义文档的结构。
    为什么使用DTD:
    通过 DTD,每一个 XML 文件均可携带一个有关其自身格式的描述。
    通过 DTD,独立的团体可一致地使用某个标准的 DTD 来交换数据。
    应用程序也可使用某个标准的 DTD 来验证从外部接收到的数据。
    还可以使用 DTD 来验证自身的数据。
    声明
    内部声明

    XML
    <!DOCTYPE root-element [element-declarations]>

    示例:

    | 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)>
    ]>

    XML示例:

    Tove
    Jani
    Reminder
    Don’t forget me this weekend
    | | —- |

    外部声明

    XML
    <!DOCTYPE root-element SYSTEM “filename”>

    示例:

    XML
    <?xml version=”1.0”?>
    <!DOCTYPE note SYSTEM “note.dtd”>

    Tove
    Jani
    Reminder
    Don’t forget me this weekend!

    上面示例中引用的外部note.dtd文档如下:

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

    XML 构建模块
    由以下几个部分组成:
    元素:元素是 XML 文档的主要构建模块。元素可包含文本、其他元素或者是空的。
    属性:可提供有关元素的额外信息。属性总是被置于某元素的开始标签中。属性总是以键/值的形式 成对出现的。

    XML
    文档类型定义(DTD) - 图1

    实体:实体是用来定义普通文本的变量。实体引用是对实体的引用。当文档被 XML 解析器解析时,实体就会被展开。

    XML解析器定义的5种标准实体
    实体引用 字符
    < <
    > >
    & &
    "
    '

    PCDATA:被解析的字符数据(parsed character data)。
    字符数据为XML 元素的开始标签与结束标签之间的文本。
    PCDATA 是会被解析器解析的文本。这些文本将被解析器检查实体以及标记。
    文本中的标签会被当作标记来处理,而实体会被展开。
    不过,被解析的字符数据不应当包含任何 &、< 或者 > 字符;需要使用 &、< 以及 > 实体来分别替换它们。
    CDATA:字符数据(character data)。
    CDATA 是不会被解析器解析的文本。在这些文本中的标签不会被当作标记来对待,其中的实体也不会被展开。
    元素
    元素声明语法

    XML
    <!ELEMENT element-name category>
    <!ELEMENT 元素名称 关键字>

    <!ELEMENT element-name (element-content)>
    <!ELEMENT 元素名称 元素内容>

    空元素
    使用EMPTY关键字进行声明:

    | XML
    <!ELEMENT element-name EMPTY>

    实例:
    <!ELEMENT br EMPTY>

    XML 示例:

    | | —- |

    只有 PCDATA 的元素
    通过圆括号中的 #PCDATA 进行声明:

    | XML
    <!ELEMENT element-name (#PCDATA)>

    实例:
    <!ELEMENT from (#PCDATA)> | | —- |

    可以带有任何内容的元素
    通过类别关键词 ANY 声明的元素:

    | XML
    <!ELEMENT element-name ANY>

    实例:
    <!ELEMENT note ANY> | | —- |

    带有子元素(序列)的元素
    通过圆括号中的子元素名进行声明:

    | XML
    <!ELEMENT element-name (child1)>

    <!ELEMENT element-name (child1,child2,…)>

    实例:
    <!ELEMENT note (to,from,heading,body)> | | —- |

    当子元素按照由逗号分隔开的序列进行声明时,这些子元素必须按照相同的顺序出现在文档中。在一个完整的声明中,子元素也必须被声明,同时子元素也可拥有子元素。
    声明只出现一次的子元素

    | XML
    <!ELEMENT element-name (child-name)>

    实例:
    <!ELEMENT note (message)>
    | | —- |

    声明最少出现一次的子元素

    | XML
    <!ELEMENT element-name (child-name+)>

    实例:
    <!ELEMENT note (message+)>
    | | —- |

    声明出现零次或多次的子元素

    | XML
    <!ELEMENT element-name (child-name*)>

    实例:
    <!ELEMENT note (message)>
    <!— 用星号(
    )声明了:子元素 message 可在 “note” 元素内出现零次或多次 —> | | —- |

    声明出现零次或一次的子元素

    | XML
    <!ELEMENT element-name (child-name?)>

    实例:
    <!ELEMENT note (message?)>
    | | —- |

    声明”非…/即…”类型的内容

    XML
    实例:
    <!ELEMENT note (to,from,header,(message|body))>

    声明混合型的内容

    XML
    实例:
    <!ELEMENT note (#PCDATA|to|from|header|message)*>

    属性
    属性声明语法

    | XML
    <!ATTLIST element-name attribute-name attribute-type attribute-value>
    <!ATTLIST 元素名称 属性名称 属性类型 默认属性值>
    DTD 实例:
    <!ATTLIST payment type CDATA “check”>

    XML 实例:
    | | —- |

    属性类型(attribute-type)选项:

    类型 描述
    CDATA 值为字符数据 (character data)
    (en1|en2|..) 此值是枚举列表中的一个值
    ID 值为唯一的 id
    IDREF 值为另外一个元素的 id
    IDREFS 值为其他 id 的列表
    NMTOKEN 值为合法的 XML 名称
    NMTOKENS 值为合法的 XML 名称的列表
    ENTITY 值是一个实体
    ENTITIES 值是一个实体列表
    NOTATION 此值是符号的名称
    xml 值是一个预定义的 XML 值

    默认属性值可使用下列值 :

    解释
    value 属性的默认值
    #REQUIRED 属性值是必需的
    #IMPLIED 属性不是必需的
    #FIXED value 属性值是固定的

    默认属性值

    | XML
    DTD:
    <!ELEMENT square EMPTY>
    <!ATTLIST square width CDATA “0”>

    XML:

    | | —- |

    #REQUIRED

    | XML
    DTD:
    <!ATTLIST person number CDATA #REQUIRED>

    合法的 XML:

    非法的 XML:

    | | —- |

    #IMPLIED

    | XML
    DTD:
    <!ATTLIST contact fax CDATA #IMPLIED>

    合法的 XML:

    合法的 XML:

    | | —- |

    #FIXED

    | XML
    DTD:
    <!ATTLIST sender company CDATA #FIXED “Microsoft”>

    合法的 XML:

    非法的 XML:

    | | —- |

    列举属性值

    | XML
    DTD:
    <!ATTLIST payment type (check|cash) “cash”>

    XML 例子:



    | | —- |

    元素VS属性
    在XML中,并没有规定何时使用属性,以及何时使用子元素。
    数据可以存储在子元素或属性。

    | XML

    Anna
    Smith


    female
    Anna
    Smith
    | | —- |

    在第一个例子中”sex”是一个属性。在后面一个例子中,”sex”是一个子元素。但是两者都提供了相同的信息。
    避免使用属性
    属性不能包含多个值(子元素可以)
    属性不容易扩展(为以后需求的变化)
    属性无法描述结构(子元素可以)
    属性更难以操纵程序代码
    属性值是不容易测试,针对DTD
    如果使用属性作为数据容器,最终的XML文档将难以阅读和维护。 尝试使用元素来描述数据。只有在提供的数据是不相关信息时才建议使用属性。
    实体
    实体是用于定义引用普通文本或特殊字符的快捷方式的变量。
    实体引用是对实体的引用。
    实体可在内部或外部进行声明。
    内部实体声明

    | XML
    语法:
    <!ENTITY entity-name “entity-value”>

    DTD 示例:
    <!ENTITY writer “Donald Duck.”>
    <!ENTITY copyright “Copyright runoob.com”>

    XML 示例:
    &writer;©right;
    | | —- |

    外部实体声明

    | XML
    语法:
    <!ENTITY entity-name SYSTEM “URI/URL”>

    DTD 示例:
    <!ENTITY writer SYSTEM “http://www.runoob.com/entities.dtd">
    <!ENTITY copyright SYSTEM “http://www.runoob.com/entities.dtd">

    XML 示例:
    &writer;©right; | | —- |