zoukankan      html  css  js  c++  java
  • 文档类型定义DTD

    XML系列:文档类型定义DTD (转)
    一,什么是DTD?
    1,XMl是一种元标记语言,是描叙语言的语言,定义标记的语法结构,从而生成新标记。而DTD则是为新标记建立文档并进行规范说明。
    也就是说XML定义标记的语法结构是通过DTD来定义,并指定文档结构的规范,而XML文档来使用标记。
    2,自描述数据的规范。

    二,DTD的作用
    1,DTD定义了文档中的元素(标记和属性)和实体,以及相互关系。数据和结构分离。
    2,通过DTD验证XML文档的有效性。DTD为解析器提供了解析XML文档的依据。所以每个XML文档必须指定对于哪个DTD有效。

    三,DTD的结构
    1,元素的声明:使用元素声明来声明XML文档中的元素

    ⑴,带有数据的元素:
    <! ELEMENT 元素名 (数据类型)>
    数据类型:
    #CDATA:指元素包含不通过解析器解析的字符数据。特殊字符和保留字不需要转义。
    #PCDATA:指元素包括解析器可解析字符数据。特殊字符和保留字需要转义才可以通过解析器。
    ANY:元素可以包含任何声明类型的子元素和字符数据。

    ⑵,带有子元素的元素:
    <! ELEMENT 元素名 (子元素1名,子元素2名)>
    多个子元素用逗号隔开。
    在文档中的顺序和定义中的顺序一致。
    子元素可以有自己的子元素。

    ①相同元素只出现一次:
    <! ELEMENT 元素名 (子元素)>
    ②相同元素至少出现一次:+
    <! ELEMENT 元素名 (子元素+)>
    ③相同元素出现零次或多次:*
    <! ELEMENT 元素名 (子元素*)>
    ④相同元素出现零次或一次:?
    <! ELEMENT 元素名 (子元素?)>

    ⑶ ,空元素:
    <! ELEMENT 元素名 (EMPTY)>
    空元素可以有属性

    ⑷,混合声明
    组可以是序列或选择子元素和/或子组:
    ①序列
    <! ELEMENT A (B)> : 元素A由单个子元素B组成.
    <! ELEMENT A (B, C)> :元素A由子元素B和C组成.
    <! ELEMENT A (B, (C | D), E> :元素A由子元素B ,E和选择子组(C或D中之一)组成.
    ②选择 子元素和/或子组
    <! ELEMENT A (B | C)>:元素A由子元素选择子组(B或C)组成.
    <! ELEMENT A (B | C | (D, E))>:元素A由包括序列子组(D和E)的选择(B或C或D,E之一)组成.

    2,属性的声明
    ⑴空属性
    <! ATTTLIST 元素名 EMPTY>
    ⑵非空属性
    <! ATTLIST 元素名 属性名 属性类型 属性值>
    属性值:
    ①,Default属性值:指定一个默认值
    <! ATTLIST 元素名 属性名 属性类型 "默认值" >
    DTD示例:
    <! ATTLIST 售价 货币单位 CDATA "人民币">
    XML示例:
    <售价 货币单位 = "人民币">10.90</售价>
    ②,Implied属性值:可以不提供该属性,该属性也没有默认值。
    <! ATTLIST 元素名 属性名 属性类型 #IMPLIED >
    DTD示例:
    <! ATTLIST 售价 货币单位 CDATA #IMPLIED>
    XML示例:
    <售价>10.90</售价>

    ③,Required属性值:必须提供该属性,但可以没有默认值。
    <! ATTLIST 元素名 属性名 属性类型 #REQUIRED >
    DTD示例:
    <! ATTLIST 售价 货币单位 CDATA #REQUIRED>
    XML示例:
    <售价 货币单位 = "美元">10.90</售价>

    ④,Fixed属性值:使属性具有固定值,不可以更改。
    <! ATTLIST 元素名 属性名 属性类型 #FIXED "固定值">
    DTD示例:
    <! ATTLIST 售价 货币单位 CDATA #FIXED "人民币">
    XML示例:
    <售价 货币单位 = "人民币">10.90</售价>

    属性类型:
    ①,Enumerated属性类型:使默认值成为一组固定值中之一。
    <! ATTLIST 元素名 属性名 (固定值A|固定值B|...) 默认固定值之一>
    DTD示例:
    <! ATTLIST 售价 货币单位 ("人民币"|"美元"|"欧元") "人民币">
    XML示例:
    <售价 货币单位 = "欧元">10.90</售价>

    ②,ID和IDREF属性类型
    1,ID:用于搜索某个元素的特定实例,每个元素都可以具有ID类型的属性。
    <! ATTLIST 元素名 属性名 ID 属性值>
    DTD示例:
    <! ATTLIST 售价 支付方式 ID #REQUIRED>
    XML示例:
    <售价 ID = "BOOK1">10.90</售价>
    <售价 ID = "BOOK2">10.90</售价>
    <售价 ID = "BOOK3">10.90</售价>
    2,IDREF:指向一个元素,引用其他元素中的一个元素。
    <! ATTLIST 元素名 属性名 IDREF 属性值>
    DTD示例:
    <! ATTLIST 售价 货币单位 ID #REQUIRED>
    <! ATTLIST 售价 货币单位 IDREF #IMPLIED>
    <! ATTLIST 售价 货币单位 CDATA #IMPLIED>
    XML示例:
    <售价 ID = "BOOK1" 货币单位 = "人民币">10.90</售价>
    <售价 ID = "BOOK2" IDREF = "BOOK1"></售价>
    ③,IDREFS属性类型
    指向多个元素ID,用空格分开。用于指向XML文档中的相关元素列表。
    <! ATTLIST 元素名 属性名 IDREFS 属性值>

    四,使用DTD

    1,内部DTD
    XML声明后在XDOCTYPE声明中编写内部DTD。
    <! DOCTYPE 根元素名 [
    元素声明
    。。。
    ]>
    2,外部DTD
    编写DTD文件,扩展名为DTD,在XML文档DOCTYPE声明中添加DTD引用,告诉解析器外部DTD信息,
    <! DOCTYPE 根元素名 SYSTEM "DTD文件名.dtd">

    3,DTD中的内部实体和外部实体和
    参见:XML系列:XML文档结构 中的实体;

    4,DTD中的参数实体
    先用内部DTD声明,把参数实体设置为元素名 ,在XML文件中引用 外部DTD验证。

    DTD文件
    ...
    <! ENTITY %实体名 "字符数据">
    <! ELEMENT 元素名 ( %实体名)>
    <! ELEMENT %实体名 (子元素)>
    ...

    XML文件
    ...
    <! DOCTYPE 根元素名 SYSTEM “DTD文件名.dtd”[
    <! ENTITY %实体名 "替换实体名的元素名">
    ]>
    ...

    例子:不同元素的XML共同关联一个DTD文件

    DTD文件
    ...
    <! ENTITY %element "e">
    <! ELEMENT root ( %element)>
    <! ELEMENT %element (name,sex,。。。)>
    ...

    XML文件1
    ...
    <! DOCTYPE root SYSTEM “DTD文件名.dtd”[
    <! ENTITY %element "student">
    ]>
    <root>
    <student>
    <name>张三学生</name>
    ...
    <student>
    </root>

    XML文件2
    ...
    <! DOCTYPE root SYSTEM “DTD文件名.dtd”[
    <! ENTITY %element "teatcher">
    ]>
    <root>
    <teatcher>
    <name>王五老师</name>
    ...
    <teatcher>
    </root>
  • 相关阅读:
    C# 从服务器下载文件
    不能使用联机NuGet 程序包
    NPOI之Excel——合并单元格、设置样式、输入公式
    jquery hover事件中 fadeIn和fadeOut 效果不能及时停止
    UVA 10519 !! Really Strange !!
    UVA 10359 Tiling
    UVA 10940 Throwing cards away II
    UVA 10079 Pizze Cutting
    UVA 763 Fibinary Numbers
    UVA 10229 Modular Fibonacci
  • 原文地址:https://www.cnblogs.com/dkblog/p/1980751.html
Copyright © 2011-2022 走看看