学习DTD-阿里云开发者社区

开发者社区> 科技小能手> 正文

学习DTD

简介:
+关注继续查看
1. 内部的 DOCTYPE 声明
当需要把 DTD 被包含在 xml 源文件中,则:
<!DOCTYPE 根元素 [元素声明]>
Example:
<?xml version="1.0" encoding="GB18030"?> 
<!DOCTYPE chinese [ 
    <!ELEMENT chinese (people*)> 
    <!ELEMENT people    (name,sex,age)> 
    <!ELEMENT name      (#PCDATA)> 
    <!ELEMENT sex         (#PCDATA)> 
    <!ELEMENT age         (#PCDATA)> 
]> 
<chinese> 
    <people> 
        <name>咚咚</name> 
        <sex></sex> 
        <age>8</age> 
    </people> 
    <people> 
        <name>小花</name> 
        <sex></sex> 
        <age>5</age> 
    </people> 
</chinese>
 
2.外部DTD
更多时候,我都会把 DTD 和 xml 源文件分离的,因此我们需要在xml源文件引用DTD:
<!DOCTYPE 根元素 SYSTEM "DTD文件名">
xml file:
<?xml version="1.0" encoding="GB18030"?> 
<!DOCTYPE chinese SYSTEM "chinese.dtd"> 
<chinese> 
    <people> 
        <name>咚咚</name> 
        <sex></sex> 
        <age>8</age> 
    </people> 
    <people> 
        <name>小花</name> 
        <sex></sex> 
        <age>5</age> 
    </people> 
</chinese>
DTD file:
<!ELEMENT chinese (people*)> 
<!ELEMENT people    (name,sex,age)> 
<!ELEMENT name        (#PCDATA)> 
<!ELEMENT sex         (#PCDATA)> 
<!ELEMENT age         (#PCDATA)>
 
3. 公用DTD
<!DOCTYPE 根元素名 
            PUBLIC    " DTD的标识名"    "DTD的URL"    
>
Example:
<!DOCTYPE html 
PUBLIC "-//W3C//DTD HTML 3.2//EN" 
"http://www.w3.org/TR/HTML/html.dtd">

 
ELEMENT元素
声明一个element :
<!ELEMENT 元素名称 类别>
      or
<!ELEMENT 元素名称 (元素内容)>
  • 1. 空元素
    <!ELEMENT 元素名称 EMPTY>
    Example:  <br /> br就是空元素
     
  • 2. 任意类型的元素
        带有任何内容(字符串、子元素、空元素)的元素,通过类别关键词ANY声明的元素,可包含任何可解析数据的组合:
    <!ELEMENT 元素名称 ANY>
    应尽量避免使用ANY定义。
     
  • 3. 字符串值的元素 
        通过圆括号中的#PCDATA进行声明:
    <!ELEMENT 元素名称 (#PCDATA)>
     
  • 4. 带有子元素(序列)的元素  
     定义要求顺序的子元素:
    <!ELEMENT 元素名称 (子元素名称1, 子元素名称2, ...)>
    定义互斥的子元素:
    <!ELEMENT 元素名称 (子元素名称1 | 子元素名称2 | ...)>
     
  • 5. 混合型元素
    <!ELEMENT    父元素名称 (#PCDATA | 子元素名)*>
    #PCDATA必须在第一位,可选的子元素可任意多项。
    Example: <!ELEMENT 计算机书籍 (#PCDATA | 书名 | 作者 | 价格 | 简介)*>
      子元素出现的频率:
             +  表明子元素可以出现一次或多次;
             *  表明子元素可以出现零次或多次;
             ?  表明子元素可以出现零次或一次。
 
ATTLIST属性
声明一个属性
<!ATTLIST 元素名称 属性名称 属性类型 默认值>
 
属性类型
  1. CDATA
    任意文本字符串。DTD不能指定属性为一个整数或一个日期,Schema能提供更为强大的数据类型
  2. ID
    值为唯一的数字。由于数字不是合法的XML名称,所以ID编号不能以数字开头,解决办法是在前面加下划线或字母。
  3. IDREF
    指向文档中某元素的ID类型的属性。如:
    <project project_id="p1">        
         <goal>deploy linux</goal>     
         <team_member person_card_id="c123" /> 
    </project> 
    <person card_id="c123">        
        <name>linuxsir</name>        
        <assignment project_project_id="p1" /> 
    </person>
    project元素的project_id属性和person元素的card_id属性应该是ID类型。
    team_member元素的 person_card_id属性和assignment元素的project_project_id属性是IDREF类型。对应的声明如下:
    <!ATTLIST person    card_id    ID #REQUIRED> 
    <!ATTLIST project project_id ID #REQUIRED> 
    <!ATTLIST team_member person_card_id IDREF #REQUIRED> 
    <!ATTLIST assignment    project_project_id IDREF #REQUIRED> 

  4. IDREFS
    当某个元素需要引用多个其他元素时使用该元素。如:
    <!ATTLIST person    card_id    ID    #REQUIRED 
                                        assignment IDREFS #REQUIRED> 
    <!ATTLIST project project_id ID #REQUIRED 
                                        team    IDREFS #REQUIRED>
    对应的文档可写成:
    <project project_id="p1" team="c123">        
         <gold>deploy linux</gold> 
    </project> 
    <person card_id="c123" assignment="p1">        
         <name>Linuxsir</name> 
    </person>

  5. (value1 | value2 | ...)
     枚举候选值,默认值为其中一个
  6. ENTITY
    ENTITY类型的属性包含在DTD的其它位置声明的未析实体的名称中。如movie元素可能有一个标识激活时播放mpeg或rm文件的实体属性:
    <!ATTLIST movie src ENTITY #REQUIRED>
    如果DTD声明了一个名为play的未析实体,则此movie元素可用于在XML文档中嵌入视频文件:
    <movie src="play" />
     
  7. ENTITIES
    ENTITIES类型的属性包含在DTD的其它位置声明的多个未析实体名称,其间用空白隔开。
    <!ATTLIST slide_show slides ENTITIES #REQUIRED>
    如果DTD声明了未析实体slide1、slide2、slide3、...,则可使用slide_show元素在XML文档中嵌入幻灯片。
    <slide_show slides="slide1 slide2 slide3" />
     
  8. NMTOKEN
    NMTOKEN 类型属性值是一个XML名称记号。XML名称记号与XML名称类似,但XML名称记号允许所有的字符作为名称的开始字符,而XML名称的第一个字母必须是 字母、表意字符和下划线。因此10,.bashrc是合法的XML名称标记,但不是合法的XML名称。每个XML名称都是一个XML名称标记,然而XML 名称标记不全是XML名称。如果属性包含1990,2005之类的整数,则应该指定其类型为NMTOKEN。如:
    <!ELEMENT person birthday NMTOKEN #REQUIRED>
     
  9. NMTOKENS
    NMTOKENS类型属性包含一个或多个用空白分隔的XML名称记号。如:
    <person dates="02-01-2005 03-01-2005 05-01-2005">person</person>
    对应的声明应为:
    <!ATTLIST person dates NMTOKENS #REQUIRED>
     
    另一方面,对01/02/2005这样的形式不能使用该声明,因为其中的正斜杠不是合法的名称字符。
     
  10. xml:
    值是一个预定义的 XML 值
     
  11. NOTATION
    NOTATION类型的属性包含在文档的DTD中声明的某个记法的名称。该属性类型较少用。理论上,可以使用该属性使某些特殊元素与类型相关联,下例声明为不同的图像类型定义了4个记法,然后规定每个image元素都必须从中选择一种type属性。
    <!NOTATION gif SYSTEM "image/gif">
    <!NOTATION tiff SYSTEM "image/tiff">
    <!NOTATION jpeg SYSTEM "image/jpeg">
    <!NOTATION png SYSTEM "image/png">
    <!ATTLIST image type NOTATION (gif | tiff | jpeg | png) #REQUIRED>
    每个image元素的type属性的值可以为gif,tiff,jpeg和png四个值中的一个。该属性比枚举类型稍具优势,因为记法 的实际MIME媒体类型在理论上是可用的。由于斜杠在XML名称中不是一个合法字符,所以枚举类型不能指定image/png或image/jpeg作为 允许值。
属性默认值
 1. #IMPLIED,属性可选。
 2. #REQUIRED,属性必须有。
 3. #FIXED,属性是常量,不能更改。
     <!ATTLIST person name CDATA #FIXED "charley">
4. 实际值
     <!ATTLIST person QUANT  CDATA  "1">

 
ENTITY实体
实体是用于定义用于定义引用普通文本或特殊字符的快捷方式的变量。
 
一个内部实体声明
<!ENTITY 实体名称 "实体的值">
DTD example:
<!ENTITY writer "charley"> 
<!ENTITY copyright "Copyright icansoft.blog.51cto.com">
xml example:
<author>&writer;©right;</author>
一个实体由三部分构成: 一个和号 (&), 一个实体名称, 以及一个分号 (;)。
 
一个外部实体声明
可定义一个外部实体,引用外部XML文档
<!ENTITY 实体名称 SYSTEM "URI/URL">
DTD example:
<!ENTITY writer SYSTEM "http://www.w3c.com/dtd/entities.dtd"> 
<!ENTITY copyright SYSTEM "/xml/copyright.xml">
 
参数实体可定义一组通用的实体,在文档中可通过该参数实体来引用实体。参数实体的定义与通用实体定义类似,只是中间多了一个%,引用时也是用%代码&。
 
<!ENTITY % person "name,address,postcode">
引用方法%person;
这样会用name,address,postcode代替参数实体%person;

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


本文转自 Icansoft 51CTO博客,原文链接: 
http://blog.51cto.com/android/109790

版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

相关文章
阿里云服务器怎么设置密码?怎么停机?怎么重启服务器?
如果在创建实例时没有设置密码,或者密码丢失,您可以在控制台上重新设置实例的登录密码。本文仅描述如何在 ECS 管理控制台上修改实例登录密码。
8844 0
spring源码学习之【准备】cglib动态代理例子
一:委托者 1 package com.yeepay.porxy.cglib.test; 2 3 import java.util.HashMap; 4 import java.
818 0
Python语言学习:python语言的特点、入门、基础用法之详细攻略
Python语言学习:python语言的特点、入门、基础用法之详细攻略
57 0
阿里云服务器端口号设置
阿里云服务器初级使用者可能面临的问题之一. 使用tomcat或者其他服务器软件设置端口号后,比如 一些不是默认的, mysql的 3306, mssql的1433,有时候打不开网页, 原因是没有在ecs安全组去设置这个端口号. 解决: 点击ecs下网络和安全下的安全组 在弹出的安全组中,如果没有就新建安全组,然后点击配置规则 最后如上图点击添加...或快速创建.   have fun!  将编程看作是一门艺术,而不单单是个技术。
10657 0
阿里云服务器如何登录?阿里云服务器的三种登录方法
购买阿里云ECS云服务器后如何登录?场景不同,阿里云优惠总结大概有三种登录方式: 登录到ECS云服务器控制台 在ECS云服务器控制台用户可以更改密码、更换系.
12487 0
spring源码学习【准备】之jdk动态代理和cglib动态代理的区别和性能
一:区别:---->JDK的动态代理依靠接口实现,如果有些类并没有实现接口,则不能使用JDK代理,这就要使用cglib动态代理了。--->JDK的动态代理机制只能代理实现了接口的类,而不能实现接口的类就不能实现JDK的动态代理,cglib是针对类来实现代理的,他的原理是对指定的目标类生成一个子类,并覆盖其中方法实现增强,但因为采用的是继承,所以不能对final修饰的类进行代理。
925 0
阿里云ECS云服务器初始化设置教程方法
阿里云ECS云服务器初始化是指将云服务器系统恢复到最初状态的过程,阿里云的服务器初始化是通过更换系统盘来实现的,是免费的,阿里云百科网分享服务器初始化教程: 服务器初始化教程方法 本文的服务器初始化是指将ECS云服务器系统恢复到最初状态,服务器中的数据也会被清空,所以初始化之前一定要先备份好。
11459 0
23706
文章
0
问答
文章排行榜
最热
最新
相关电子书
更多
《2021云上架构与运维峰会演讲合集》
立即下载
《零基础CSS入门教程》
立即下载
《零基础HTML入门教程》
立即下载