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>
  • 相关阅读:
    集群临时重启
    elasticsearch索引目录设置
    elasticsearch索引路径规则
    spring boot 使用application.properties 进行外部配置
    ELASTICSEARCH健康red的解决
    Elasticsearch——使用_cat查看Elasticsearch状态
    vmstat命令
    ava Maven项目之Nexus私服搭建和版本管理应用
    android 2.2 videoView 诡异bug
    华为部分设备运行很卡的问题
  • 原文地址:https://www.cnblogs.com/dkblog/p/1980751.html
Copyright © 2011-2022 走看看