1.内部DTD
       
最简单的使用DTD的方法是在XML文件的序言部分加入一个DTD描述,加入的位置是紧接在XML处理指示之后。一个包含DTD的XML文件的结构为:

   <?xml version = "1.0" encoding="GB2312" standalone = "yes"?>
<!DOCTYPE 根元素名[
    元素描述
    ]>
文件体.

一个完整的XML文件为:

<?xml version = "1.0" encoding="GB2312" standalone = "yes"?>
<!DOCTYPE 联系人列表[
        <!ELEMENT 联系人列表 (联系人)*>
        <!ELEMENT 联系人 (姓名,ID,公司,EMAIL,电话,地址)>
        <!ELEMENT 地址 (街道,城市,省份)>
        <!ELEMENT 姓名 (#PCDATA)>
        <!ELEMENT ID (#PCDATA)>
        <!ELEMENT 公司 (#PCDATA)>
        <!ELEMENT EMAIL (#PCDATA)>
        <!ELEMENT 电话 (#PCDATA)>
        <!ELEMENT 街道 (#PCDATA)>
        <!ELEMENT 城市 (#PCDATA)>
        <!ELEMENT 省份 (#PCDATA)>
    ]>
<?xml-stylesheet type="text/xsl" href="mystyle.xsl"?>

<联系人列表>
  <联系人>
    <姓名>张三</姓名>
    <ID>001</ID>
    <公司>A公司</公司>
    <EMAIL>zhang@aaa.com</EMAIL>
    <电话>(010)62345678</电话>
    <地址>
      <街道>五街1234号</街道>
      <城市>北京市</城市>
      <省份>北京</省份>
    </地址>
  </联系人>

  <联系人>
    <姓名>李四</姓名>
    <ID>002</ID>
    <公司>B公司</公司>
    <EMAIL>li@bbb.org</EMAIL>
    <电话>(021)87654321</电话>
    <地址>
      <街道>南京路9876号</街道>
      <城市>上海市</城市>
      <省份>上海</省份>
    </地址>
  </联系人>
</联系人列表>

2.  外部DTD
        
一个DTD既可以是内部的,包含在一个“形式良好的”XML文件中(standalone=“yes”);也可以是外部的,作为一个外部文件被引用(standalone=“no”)。
        外部DTD的好处是:它可以方便高效地被多个XML文件所共享。你只要写一个DTD文件,就可以被多个XML文件所引用。事实上,当许多组织需要统一它们的数据交换格式时,它们就是通过外部DTD来完成的。这样做不仅简化了输入工作,还保证当你需要对DTD做出改动时,不用一一去改每个引用了它的XML文件,只要改一个公用的DTD文件就足够了.
        为了引用一个外部DTD,必须修改XML声明和DOCTYPE声明。XML声明中必须说明这个文件不是自成一体的,即standalone属性的属性值不再是yes了。

<?xml version = "1.0" 
      encoding="GB2312" 
      standalone = "no"?>

在DOCTYPE声明中,应该加入SYSTEM属性:

<!DOCTYPE 根元素名
SYSTEM "外部DTD文件的URL">

例如:

<!DOCTYPE 联系人列表
SYSTEM "http://www.mydomain.com/dtds/fclml.dtd
">

上面的URL是一个绝对路径,除此以外,它还可以是一个相对路径,如:

<!DOCTYPE 联系人列表
SYSTEM "fclml.dtd">

它说明这个DTD文件和引用它的XML文件在同一个目录下。或者,这个DTD文件还可能在XML文件的父目录的子目录DTD下,表示为:

<!DOCTYPE 联系人列表
SYSTEM "../dtds/fclml.dtd">

使用这种方法,你可以方便地把DTD文件从你的XML文件中分离出来,粘贴到另一个文件fclml.dtd中。这样,你就得到一个DTD文件和一个有效的XML文件。

仍然回到前面那个包含客户联系方式信息的XML文件,如果使用外部DTD,其形式应该变为下面这个样子。DTD文件fclml.dtd:

<?xml version="1.0" encoding="GB2312"?>

<!ELEMENT 联系人列表 (联系人)*>
<!ELEMENT 联系人 (姓名,ID,公司,EMAIL,电话,地址)>
<!ELEMENT 地址 (街道,城市,省份)>
<!ELEMENT 姓名 (#PCDATA)>
<!ELEMENT ID (#PCDATA)>
<!ELEMENT 公司 (#PCDATA)>
<!ELEMENT EMAIL (#PCDATA)>
<!ELEMENT 电话 (#PCDATA)>
<!ELEMENT 街道 (#PCDATA)>
<!ELEMENT 城市 (#PCDATA)>
<!ELEMENT 省份 (#PCDATA)>

XML文件client.xml:

<?xml version = "1.0" encoding="GB2312" standalone = "no"?>
<!DOCTYPE 联系人列表
    SYSTEM "fclml.dtd">
<?xml-stylesheet type="text/xsl" href="mystyle.xsl"?>

<联系人列表>
<联系人>
<姓名>张三</姓名>
<ID>001</ID>
<公司>A公司</公司>
<EMAIL>zhang@aaa.com</EMAIL>
<电话>(010)62345678</电话>
<地址>
<街道>五街1234号</街道>
<城市>北京市</城市>
<省份>北京</省份>
<ZIP>100001</ZIP>
</地址>
</联系人>

<联系人>
<姓名>李四</姓名>
<ID>002</ID>
<公司>B公司</公司>
<EMAIL>li@bbb.org</EMAIL>
<电话>(021)87654321</电话>
<地址>
<街道>南京路9876号</街道>
<城市>上海</城市>
<省份>上海</省份>
<ZIP>200002</ZIP>
</地址>
</联系人>
</联系人列表>

3. 公用DTD
        
使用外部DTD时,要在DOCTYPE中使用关键字SYSTEM。实际上,SYSTEM不是引用外部DTD的唯一方法,这个关键字主要用于引用一个作者或组织所编写的众多XML文件中通用的DTD。还存在一种外部DTD,它是一个由权威机构制订的,提供给特定行业或公众使用的DTD。因此,另一个引用外部DTD的办法是使用关键字PUBLIC,引用这一类公开给公众使用的DTD。
     引用公共DTD的形式为:

<!DOCTYPE 根元素 PUBLIC "DTD名称" "外部DTD的URL">

4.元素的定义
一个DTD不仅要告诉语法分析器它所关联的XML文件的根元素是什么,而且还要告诉语法分析器文件的内容和结构,说清文件结构中的每一个细节。为了定义这些细节,我们必须展开DTD中元素说明部分,使用元素类型声明(ETD)来声明所有有效的文件元素。ETD应该采用如下的结构:

<!ELEMENT 元素名 元素内容描述>

一个具体例子:

<?xml version = "1.0" encoding="GB2312" standalone = "yes"?>
<!DOCTYPE 联系人列表[
    <!ELEMENT 联系人列表 ANY>
    <!ELEMENT 联系人(姓名)>
    <!ELEMENT 姓名(#PCDATA)>    
    ]>

<联系人列表>
    <联系人>
        <姓名>张三</姓名>
    </联系人>
</联系人列表>

元素定义是由它们的元素内容模型(ECM)来描述的,也就是说,是由紧跟元素后面的括号中的内容来定义的。元字符的定义:

元 字 符 含    义
+ 出现一次或多次
* 出现零次或多次
可选,不出现或出现一次
() 一组要共同匹配的表达式
| OR,或
AND,要求严格遵从顺序要求
元素A
元素B
元素C
元素列表,无须遵从顺序要求

注意:在一个组中,只允许使用一种连接符(例如“,”或“|”)。因此,象下面这样定义的DTD是不合法的:

<!ELEMENT 联系人(姓名,电话|EMAIL)>

要想使用多种连接符,只有通过创建子组的方式,使用:

<!ELEMENT 联系人(姓名,(电话|EMAIL))>

5.元素的属性
 
在DTD中定义属性时,我们使用下面的格式:
 

<!ATTLIST 元素名 (属性名 属性类型 缺省值)*>
  • 必须赋值的属性
    关键字REQUIRED说明XML文件中必须为这个属性给出一个属性值。例如,假设你想定义一个"页面作者"元素,并把这个元素加入所有网站中的每一个页面。之所以定义这个元素,是为了页面编辑者能够提供他的联系信息,以便当发现页面错误或无效链接时,可以及时地通知他。在这种情况下,每个页面作者都有不同的个人信息,所以你无法事先知道应该用什么作为缺省值,但你又的确需要提供每个人的信息。这时候,你就可以把与联系信息相关的属性定义为必须的(REQUIRED),而且不用提供缺省值。
  • 属性值可有可无的属性
    当使用IMPLIED关键字时,文法解释器不再强行要求你在XML文件中给该属性赋值,而且也无须在DTD中为该属性提供缺省值。可以说,这是对属性值有无的最低要求,现实中经常用到。
  • 固定取值的属性
    还有一种特殊情况,你需要为一个特定的属性提供一个缺省值,并且不希望XML文件的编写者把你的缺省值替代掉。这时候,就应该使用FIXED关键字,同时为该属性提供一个缺省值。
  • 定义缺省值的属性
    如果不使用上面任何一种关键字的话,该种属性就是属于这种类型。对于这种属性,你需要在DTD中为它提供一个缺省值。而在XML文件中可以为该属性给出新的属性值来覆盖事先定义的缺省值,也可以不另外给出属性值,后一种情况下它就默认为采用DTD中给出的缺省值。

  视实际情况而选择,给出一个实际的例子: 

<!ATTLIST 页面作者 
        姓名 #CDATA #IMPLIED 
        年龄 #CDATA #IMPLIED 
        联系信息 #CDATA #REQUIRED 
        网站职务 #CDATA #FIXED "页面作者" 
        个人爱好 #CDATA "上网">

另外还有属性的类型:

  • CDATA
  • Enumerated
  • ID
  • IDREF
  • IDREFS
  • ENTITY
  • ENTITIES
  • NMTOKEN
  • NMTOKENS
  • NOTATION

参数实体专门用在DTD中。定义方式是:

<!ENTITY % 实体名 "实体内容">

<!ENTITY % 实体名 SYSTEM "外部文件名">

引用方式为: %实体名;
使用参数实体,可以方便元素和属性的声明。例如:

<!ENTITY % TAG_NAMES "姓名 | EMAIL | 电话 | 地址">
<!ELEMENT 个人联系信息 (%TAG_NAMES; | 生日)>
<!ELEMENT 客户联系信息 (%TAG_NAMES; | 公司名)>

http://www.cnblogs.com/jeffchen/archive/2006/04/25/384513.html

DTD验证XML(转)的更多相关文章

  1. DTD验证XML文档

    DTD验证XML文档        1.DTD简介:DTD是Document Type Definition的缩写,即文档定义            1.1:DTD的内容包含:             ...

  2. XML组成结构以及C#通过DTD验证规范性

    XML 文档包含元素和属性等,它们提供一种灵活且功能强大的方法,为应用程序和组织之间交换数据.所有的 XML 文档(以及 HTML 文档)均由以下简单的构建模块构成: 1.元素 元素是XML的主要构建 ...

  3. XML DTD验证

    XML DTD验证 一.什么是DTD 文档类型定义(DTD:Document Type Definition)可定义合法的XML文档构建模块.它使用一系列合法的元素来定义文档的结构. DTD 可被成行 ...

  4. dom4j解析xml时取消DTD验证

    解决方式整合一下,就分两种: 1.用setFeature() SAXReader reader = new SAXReader();reader.setValidation(false); reade ...

  5. Delphi 7验证XML合法性(利用DTD、XSD)

    拥有正确语法的XML被称为“形式良好”的XML.通过DTD验证的XML是“合法”的XML.DTD(文档类型定义)的作用是定义XML 文档的合法构建模块.它使用一系列的合法元素来定义文档结构.XML S ...

  6. XSD(XML Schema Definition)用法实例介绍以及C#使用xsd文件验证XML格式

    XML Schema 语言也称作 XML Schema 定义(XML Schema Definition,XSD),作用是定义 XML 文档的合法构建模块,类似 DTD,但更加强大. 作用有: ①定义 ...

  7. 使用架构(XSD)验证XML文件

    假使说XML是一个数据库,那么XSD就是这个数据库的结构.由此可见,XSD是如此重要,如果没有它,我们如何声明以及验证我们需要的XML数据文件的格式和合法性呢?那是不可能完成的任务,如果你将XML数据 ...

  8. udp开发-dtd验证,dom解析

    //博主太懒了,并没有提供范例程序 6.基于UDP开发 (1)发送方:socket->准备数据包 DatagramSocket docket = new DatagramSocket(); // ...

  9. Eclipse中DTD验证导致无法进行代码提示的问题(转)

    eclipse的xml插件进行dtd验证的时候由于找不到dtd或请求主机相应超时,会出现黄色的警告 The file cannot be validated as the host "www ...

随机推荐

  1. 掌握Java字节码(转)

    Java是一门设计为运行于虚拟机之上的编程语言,因此它需要一次编译,处处运行(当然也是一次编写,处处测试).因此,安装到你系统上的JVM是原生的程序,而运行在它之上的代码是平台无关的.Java字节码就 ...

  2. Ubuntu 设备 spark

    周围环境: Unbunt 12.04 Hadoop 2.2.x Sprak 0.9 Scala scala-2.9.0.final.tgz 一步 1. 下载 scala 2. 解压scala,然后改动 ...

  3. android学习一些帖子

    关于谷歌和苹果的帖子 http://news.eoe.cn/18576.html android无线调试的帖子: http://baoyz.com/android/2014/06/24/adb-wir ...

  4. easyui LinkButton

    http://www.zi-han.net/case/easyui/menu&button.html

  5. Android SQLite 数据库 增删改查操作

    Android SQLite 数据库 增删改查操作 转载▼ 一.使用嵌入式关系型SQLite数据库存储数据 在Android平台上,集成了一个嵌入式关系型数据库--SQLite,SQLite3支持NU ...

  6. Oracle GoldenGate (以下简称ogg)在异种移植os同一种db之间的数据同步。

    Oracle GoldenGate (以下简称ogg)在异种移植os同一种db之间的数据同步. ogg要实现的功能: 同步可以细化到单个表,满足特定的where条件rows同步,称号column同步. ...

  7. SQL查询优化——数据结构设计

    本文部分内容会涉及mysql,可能在其它数据库中并不适用. 本章节仅仅针对数据库结构设计做讨论.查询优化的其它内容待续. 数据库设计及使用是WEB开发程序猿必备的一项基础技能,在大数据量和高并发场景, ...

  8. IOS本地化应用

    BK项目已完成7788,在项目的后期需要被翻译成多国语言版.为了适应全球多个国家使用多个存储. 应用本地化是分别对字符串.图片和 xib 或 storyboard 文件本地化,而传统的做法是对 xib ...

  9. 网页信息抓取进阶 支持Js生成数据 Jsoup的不足之处

    转载请标明出处:http://blog.csdn.net/lmj623565791/article/details/23866427 今天又遇到一个网页数据抓取的任务,给大家分享下. 说道网页信息抓取 ...

  10. Python 保存爬行动物捕捉网页

    选址的桌面壁纸网站汽车主题: 下面的两个print打开调试期间 #print tag #print attrs #!/usr/bin/env python import re import urlli ...