XML.一个简单的文档类型定义.DTD

时间:2021-10-10 12:03:59
  • Document Type Definition
  • DTD这个词其实在SGML就看到过了
  • 其实没错,DTD本是面向SGML的
  • 通常在某一领域内,其信息的交换都是遵循一定的模式的
  • 所以我们就希望来约束这种信息的模式,加强信息在双方之间的可交换性
  • XML本身SGML的子集,其DTD也自然可以拿来用
  • 而XML用的DTD又是SGML的DTD的一个子集

XML uses a subset of SGML DTD.
——Wikipedia

  • 不过这种简单省事的继承,使得DTD有太多的局限性和缺陷
    • 没有采用和XML一致的语法
    • 只能有一个外部DTD来约束XML
    • 不支持XML的命名空间
    • 缺乏足够的描述能力
    • 数据类型过于简单

DTD的引用

  • A Document Type Definition (DTD) defines the legal building blocks of an XML document.
  • It defines the document structure with a list of legal elements and attributes.
  • A DTD can be declared inline inside an XML document, or as an external reference.
    ——Wikipedia

内部DTD

<?xml version="1.0" standalone="yes"?>
<!DOCTYPE student [
...
...
]>
<student>
...
...
</student>
  • 这是一个XML文件,而其DTD规则是直接写在XML文件内的
  • 也可以单独写一个DTD文件,而只在XML内声明与这个XML文件所匹配的DTD文件的路径。

外部DTD

  • 外部DTD的好处就是,写一个DTD文件,可以为同类型的多个XML文件进行模式规定。这种模式规定其实称为验证更为准确。
  • 分为私有和公开的DTD引用方法
<!DOCTYPE root_element SYSTEM "DTD_location"> 
  • 私有DTD声明
    • root_element即是本XML文档根元素的名称
    • DTD_location表名DTD文件所在的URL,相对or绝对都可以
<!DOCTYPE root_element PUBLIC "DTD_name" "DTD_location"> 
  • 公有DTD声明
    • 这种 DTD 文件由由权威机构制订的、提供给特定行业或公众使用的 DTD,甚至可能通过了国际标准化组织的批准,以便数据的提供者和使用者对所交互的数据进行有效性验证
    • DTD_name有语法的限制
      • ”prefix//owner_of_the_DTD//description_of_the_DTD//language_identifier”
      • prefix
        • ISO:表示通过批准的ISO标准
        • +:表示通过批准的非ISO标准
        • -:表示未通过批准的非ISO标准
      • owner_of_the_DTD 表示发布该文档的机构。
      • description_of_the_DTD 表示对该文档的简短描述。
      • description_of_the_DTD 表示对该文档的简短描述。

DTD语法

元素

<!ELEMENT element-name category>
<!ELEMENT element-name (element-content)>
  • <!ELEMEMT表示元素声明的开始
  • element-name为元素名。未在DTD中声明的元素名则不允许出现在其验证的XML文档中。
  • category或(element-content)
    • 这之后可以规定该元素的类型、或者是内容模型

类型与内容模型


<!ELEMENT element-name EMPTY> 
  • 空元素

<!ELEMENT element-name ANY> 
  • 包含任意内容的元素

<!ELEMENT element-name (#PCDATA)> 
  • 只包含文本,不能包含子元素

<!ELEMENT element-name (child1,child2,...)> 
  • 只包含子元素的元素
    • (child1,child2,…)是一个序列,同时也是内容模型的一种
    • 表示该元素必须包含这里面所有的子元素,且顺序一致
  • 关于内容模型
    • 各种符号
符号 含义 示例
, 分隔序列,表明顺序 如上
| 选择前后任意一项 (child1|child2)表示必须包含其中一个子元素
() 内部作为整体 (child1,child2)|child3表示要么包含child1和child2,要么包含child3
表示相应的元素出现0或1次 child1?表示出现child1元素0或1次(可有可无,有则一个)
+ 表示1次或多次 child1+表示至少一个child1子元素
* 表示0次或1次或多次 child1*就随便出现几次喽
  • 一些示例
<!ELEMENT note (to,from,header,(message|body))>
<!ELEMENT article (title, subtitle?, author*, (para | table | list)+,bibliography?)>

<!ELEMENT element-name (#PCDATA | child1 | child2 | ...)*> 
  • 包含指定的子元素以及文本内容的元素

属性

<!ATTLIST element-name attr-name attr-type attdesc> 
  • 多个属性如下
<!ATTLIST element-name attr1 attr-type1 attdesc1
attr2 attr-type2 attdesc2
>

<!ATTLIST element-name attr1 attr-type1 attdesc1>
<!ATTLIST element-name attr2 attr-type2 attdesc2>
  • 属性类型
    • CDATA:任意字符串
    • (value1|value2|…):枚举
    • NMTOKEN:必须是合法的XML标记
    • ID:文档中唯一,必须字母或下划线开头,可以由字母、数字、下划线、横线、点号组成
    • IDREF:表示引用另一个属性的ID
    • ENTIT:实体
  • 属性声明的描述
    • value:即属性的值,缺省为value
    • #REQUIRED:该属性是必须的
    • #IMPLIED:是可选的
    • #FIXED value:是可选的,如果有则必须为指定的value

  • 示例1
<!ATTLIST memo id ID #REQUIRED
security (high|low) "high"
keywords NMTOKENS #IMPLIED
>

  • 示例2
<!ELEMENT Step EMPTY> 
<!ATTLIST Step id ID #REQUIRED>
<!ELEMENT StepLink EMPTY>
<!ATTLIST StepLink steps IDREFS #IMPLIED>

如果在该文档中存在:

<Step id="step1"/> 
<Step id="step2"/>

<StepLink steps="step1 step2"/> 

是正确的


实体

XML.一个简单的文档类型定义.DTD


  • 内部参数实体
    • 用于在DTD规则中占位。不能用于XML文档中
    • 不能包含XML文本
<?xml version="1.0" standalone="no"?>
<!DOCTYPE student [
<!-- DTD example-->
<!ENTITY % p "(#PCDATA)">
<!ELEMENT student (id,surname,firstname)>
<!ELEMENT id %p;>
<!ELEMENT surname %p;>
<!ELEMENT firstname %p;>
]>

  • 外部参数实体
    • 相当于向DTD文件中导入一个外部文件

语法

<!ENTITY % entity-name SYSTEM "URI"> 

<!ENTITY % entity-name PUBLIC "public_ID" "URI">

示例

<?xml version="1.0" standalone="no"?>
<!DOCTYPE student [
<!ENTITY % studentdtd SYSTEM "http://example.org/student.dtd">
%studentdtd;
]>

<!-- 相当于往XML导入了一个外部DTD -->

  • 一般实体
    • 用于在XML文档中占位
    • 字符内容实体
      • 预定义实体
      • 命名实体
      • 数值实体
    • 未解析实体
字符内容实体

声明

<!ENTITY entity-name "entity_value"> 

引用

&entity-name; 

示例

<?xml version="1.0" standalone="yes" ?>
<!DOCTYPE author [
<!ELEMENT author (#PCDATA)>
<!ENTITY us "You and me">
]>



<author>&us;</author>
数值实体
<title>&#x5B66;&#x4E60;&#x58;&#x4D;&#x4C;</title>

将被解析为

<title>学习XML</title> 

使用了Unicode代码

未解析实体
  • 可以在 XML 数据中指明所关联的二进制文件(图片、音频、视频等等),然后由解析器通过调用适当的应用程序对这些文件进行解析
  • 可以在 XML 数据中指明所关联的二进制文件(图片、音频、视频等等),然后由解析器通过调用适当的应用程序对这些文件进行解析

示例

<?xml version="1.0" standalone="no" ?>
<!DOCTYPE img [
<!ELEMENT img EMPTY>
<!ATTLIST img src ENTITY #REQUIRED>
<!NOTATION gif SYSTEM "gif-viewer.exe">
<!ENTITY logo SYSTEM "logo.gif" NDATA gif>
]>

<img src="logo"/>