XML DTD详解

 一个有效的XML文档必然是结构正规的,结构正规的XML文档不一定是有效的,即有效的是格式正规的一个子集。

  本文详细介绍DTD,包括其对元素的定义,属性的定义,以及实体的定义。

元素的定义

DTD中的修饰符号:

  这部分符号可以联系正则表达式的符号来记忆。

属性的定义

属性类型——CDATA

  比如:

<!ATTLIST title name CDATA #REQUIRED>

  定义了一个属性,是属于title元素的,属性名叫name,类型是字符串(包括数字和中文),并且是一个必须要有的属性。

属性类型——NMTOKEN/NMTOKENS

  左边图中因为加了空格而出错。

属性类型——ID

  类型为ID的属性取值必须是唯一的。

  从这个例子还可以看到同一个元素可以一次定义多个属性,多个属性之间用空格分隔即可。

属性类型——IDREF/IDREFS

 

                                        (“儿子”后面漏掉了一个斜线)

属性类型——Enumerated

  实现定义好一些值,属性的值必须在所列出的值的范围内。

属性的特点

#REQUIRED

  元素的所有实例都必须有该属性的值(NOT NULL)。

  语法:

<!ATTLIST 元素名 属性名 属性类型 #REQUIRED>

  DTD示例:

<!ATTLIST person number CDATA #REQUIRED>

  XML示例:

<person number="6788"/>

#IMPLIED

  元素的实例中可以忽略该属性(NULL)。

  语法:

<!ATTLIST 元素名 属性名 属性类型 #IMPLIED>

  DTD示例:

<!ATTLIST contact fax CDATA #IMPLIED>

  XML示例:

<contact fax="888-228833"/>

  没有这个属性也是对的。

#FIXED value

  元素实例中该属性的值必须为指定的固定值。

  语法:

<!ATTLIST 元素名 属性名 属性类型 #FIXED "value">

  DTD示例:

<!ATTLIST sender company CDATA #FIXED "Microsoft">

  XML示例:

<sender company="Microsoft"/>

Default value

  为属性提供一个默认的值。

  语法:

<!ATTLIST 元素名 属性名 属性类型 "value">

  DTD示例:

<!ATTLIST hello paymenttype CDATA "check">

  XML示例:

<hello paymenttype="check"/>

定义实体

一般

  语法:

<!ENTITY 实体名 "实体值">

  DTD示例:

<!ENTITY writer "Donald Duck">

<!ENTITY copyright "Copyright W3Schools">

  XML示例:

<author>&writer;&copyright;</author>

外部实体:

  语法:

<!ENTITY 实体名 SYSTEM "URI/URL">

  DTD示例:

<!ENTITY writer SYSTEM "http://www.baidu.com/index.php?tn=coralqq">

<!ENTITY copyright SYSTEM "http://www.baidu.com/index.php?tn=coralqq">

  XML示例:

<author>&writer;&copyright;</author>

  与上面的区别就是加上了SYSTEM关键字。

  这样就不是使用网址的字符串来代替,而是用网址的文档本身内容。

实体类型

  前面所讲的都是普通实体,分为内部实体和外部实体。

  所谓参数实体,该实体实际上不是在具体实例化文档中使用,而是在DTD文档内部被使用。

  我们可以定义一个实体,然后在DTD内部来引用它。

  如下:

<!ENTITY %地址 "街道,城市,邮编,国家">

<!ELEMENT 联系人 (人名,电话,%地址;)>

  

总结如下:

  普通实体:DTD中定义,XML中使用,使用格式: &名;

  参数实体:DTD中定义,定义的时候要用%,DTD中使用,使用格式: %名;

  普通实体和参数实体都分为内部实体外部实体两种,外部实体定义需要加上SYSTEM关键字,其内容是URL所指向的外部文件实际的内容。

  如果不加SYSTEM关键字,则为内部实体,表示实体指代内容为字符串。

___________________________________________________________________________________________________

有效的XML: DTD(文档类型定义)介绍与三种使用方式

 

有效的XML: DTD(文档类型定义)介绍

文档类型定义和命名空间

  有效(Valid)的XML文档

  首先,XML文档是个格式正规的(Well-formed)XML文档;(见格式正规的XML:语法 属性 实体 处理指令 样式单 CDATA节)。

  其次,需要满足DTD的要求,这样的XML文档称为有效的(Valid)XML文档

DTD

  DTD,即文档类型定义——Document Type Definition。

  DTD用来描述XML文档的结构,

  一个DTD文档包含:

  元素(ELEMENT)的定义规则;

  元素之间的关系规则;

  属性(ATTLIST)的定义规则;

  可使用的实体(ENTITY)或符号(NOTATION)规则。

DTD文档与XML文档实例的关系

  类与对象;

  数据库表结构与数据记录;

  有了DTD,每个XML文件可以携带一个自身格式的描述。

  有了DTD,不同组织的人可以使用一个通用DTD来交换数据。

  应用程序可以使用一个标准DTD校验从外部世界接收来的XML数据是否有效。

  可以使用DTD校验自己的XML数据。

如何生成DTD文档

  DTD文档有三种应用形式:

  1.内部DTD文档

<!DOCTYPE 根元素[定义内容]>

  2.外部DTD文档

<!DOCTYPE 根元素 SYSTEM "DTD文件路径">

  3.内外部DTD文档结合

<!DOCTYPE 根元素 SYSTEM "DTD文件路径" [定义内容]>

内部DTD

  一个内部DTD的例子:

  上半部分是DTD,下面是XML文档,文档要符合DTD。

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE poem [
<!ELEMENT poem (author, title, content)>
<!ELEMENT author (#PCDATA)>
<!ELEMENT title (#PCDATA)>
<!ELEMENT content (#PCDATA)>
]>
<!--为元素poem定义了三个子元素author title content,
这三个元素必须要出现并且必须按照这个顺序
少元素不行,多元素也不行
-->
<!--指明author,title,content里面的内容是字符串类型-->
<poem>
<author>王维</author>
<title>鹿柴</title>
<content>空山不见人,但闻人语声。返景入深林,复照青苔上。</content>
</poem>

   

  上面的文档就是格式良好,并且有效的。

  详见其中的注释。

  #PCDATA(Parsed Character Data) ,可解析的字符数据,即字符串。

  上面部分是DTD,在下面编写XML文档时,如果不符合其DTD规范,用XMLSpy做检查的时候,是well-formed的,但是却不是valid的。

  比如根元素写:

<Students>
</Students>

  Validate检查的时候就会报错,根元素和DTD中的poem不符。

外部DTD

  上面是一个内部DTD的例子,下面用一个外部的DTD:

  首先,新建一个DTD文档,文件名叫dtd_1.dtd,内容如下:

<?xml version="1.0" encoding="UTF-8"?>
<!ELEMENT poem (author, title, content)>
<!ELEMENT author (#PCDATA)>
<!ELEMENT title (#PCDATA)>
<!ELEMENT content (#PCDATA)>

  然后,新建一个XML文档。

  如果只写XML元素内容,那么它是一个格式良好的,却不是有效的文档,因为找不到DTD。

  需要加入外部DTD文件的名称(同一个路径下只给出文件名即可)。

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE poem SYSTEM "dtd_1.dtd">
<poem>
<author>王维</author>
<title>鹿柴</title>
<content>空山不见人,但闻人语声。返景入深林,复照青苔上。</content>
</poem>

内外部DTD结合

DTD的内容也可以有些放在外部,有些放在内部,如下:

  文件dtd_2.dtd

<?xml version="1.0" encoding="UTF-8"?>
<!ELEMENT author (#PCDATA)>
<!ELEMENT title (#PCDATA)>

  XML文档:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE poem SYSTEM "dtd_2.dtd"[
<!ELEMENT poem (author, title, content)>
<!ELEMENT content (#PCDATA)>
]>
<poem>
<author>王维</author>
<title>鹿柴</title>
<content>空山不见人,但闻人语声。返景入深林,复照青苔上。</content>
</poem>

___________________________________________________________________________________________________

格式正规的XML:语法 属性 实体 处理指令 样式单 CDATA节

 

XML介绍

  eXtensible Markup Language

  XML是一种元标记语言,用户可以定义自己需要的标记。

  Document Type Definition, DTD文档类型定义。

  XML描述的是结构、内容和语义,它不描述页面元素的格式化。

  对比:HTML侧重于如何表现信息,内容描述与显示整合为一体。

  XML中的每个元素名都是成对出现的。结束标签前加一个/

  如:

<?xml version="1.0"?>
<Student>
<Name>ZhangSan</Name>
<ID>001</ID>
</Student>

  文档的后缀名是xml,每个文档有且仅有一个根元素

  所谓根元素就是包含了其他所有元素的元素。

XML vs HTML

  使用XML可以实现异构语言、异构平台之间的交互。

XML1.0语法

  XML目前只有一个版本,即1.0.

  XML是自描述数据,使用现有的国际标准。

  XML中有格式正规的XML有效的XML本文讲格式正规的。

  遵循如下规则的XML文档称为格式正规的XML文档:

语法规范:

  必须有XML声明语句;

  必须有且仅有一个根元素;

  标记大小写敏感;

  属性值用引号;

  标记成对;

  空标记关闭;

  元素正确嵌套。

元素语法:

  名称中可以包含字母、数字或者其他字符;

  名称不能以数字开头;

  不能以XML/xml/Xml…开头;

  名称中不能含空格;

  名称中不能含冒号(注:冒号留给命名空间使用)。

XML解析器

  XML解析器是读取XML文档并提供对文档内容的访问的软件模块。

  类型:无验证的解释器和验证的解释器。

  解析器:

  MSXML IE

  IBM XML4J

  Apache Xerces

  Oracel XML Parser

XML文档

  一个XML文档:

<?xml version="1.0"  encoding="utf-8" standalone="yes"?>
<!--第一行是XML声明-->
<!--这是XML处理指令的例子。处理指令以<?开始,以?>结束-->
<!--在<?后的第一个单词是处理指令名,在本例中是xml-->
<!--处理指令一定要顶格写,前面不能有任何空白--> <students> <GREETING><!--开始标记--> Hello World<!--元素内容--> </GREETING><!--结束标记--> <student gender="male" isHandsome="true">
<id>001</id>
<name>zhangsan</name>
<address>Beijing</address>
<score>50</score>
</student> <student gender="female">
<id>002</id>
<name>lisi</name>
<address>北京</address>
<score/><!--为空的简写形式-->
</student> </students>

  如其中注释:

  <!--第一行是XML声明-->

  <!--这是XML处理指令的例子。处理指令以<?开始,以?>结束-->

  <!--在<?后的第一个单词是处理指令名,在本例中是xml-->

  <!--处理指令一定要顶格写,前面不能有任何空白-->

  处理指令一定要顶格写,前面不能有任何空白。

  处理指令的?前面后面都不能有空格。

  但元素中的空白是允许的。

  文档注释用<!-- 和-->包围,不允许嵌套,允许多行注释。

  XML里面的元素严格区分大小写

  XML文档必须有且只有一个根元素

  根元素是一个完全包括文档中其他所有元素的元素。

XML文档声明

  每一个XML文档都以一个XML声明开始,用以指明所用的XML的版本。

  XML声明有version 、encoding和standalone特性。

  特性是由等号分开的名称-数值对。位于等号左边的是特姓名,而其值位于等号的右边,并用双引号或单引号括起来。

  在上例中,version特性表明这个文档符合XML 1.0规范。

  XML声明还可以有standalone特性,这告诉我们文档是否在这一个文件里,还是需要从外部导入文件。

  encoding 属性指定了编码格式,默认情况下是utf-8,这个属性要放在standalone属性前面。

  注意本文文件保存时候默认的编码格式是ANSI,需要利用记事本把它手动改为UTF-8保存。

属性

  如上所述,

  属性(特性)是由等号分开的名称-数值对。

  位于等号左边的是特姓名,而其值位于等号的右边,并用双引号或单引号括起来。

  自定义的元素也可以有一个或多个属性,其属性值使用单引号或者双引号括起来。

  如果属性值中有双引号则使用单引号,反之亦然。

  属性的形式为:

  属性名= "属性值",比如gender="male"。

  多个属性值之间用空格隔开(一个或多个空格都可以)。

  在一个元素上,相同的属性只能出现一次。

  属性值不能包含<, >, &。

实体

  实体叫ENTITY,实体的作用是避免重复输入。作用相当于宏或者变量。

  XML中内置的5种实体:

  自定义实体语法:

<!DOCTYPE 根元素[

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

]>

  引用已定义的实体:

    &实体名;

  

  使用实体的例子:

  XML代码:

<?xml version="1.0" encoding="utf-8"?>

<!DOCTYPE test[
<!--实体声明-->
<!ENTITY comA "Company A"> <!ENTITY addA "Some Place"> ]>
<test> <!--直接写进去的方法-->
<company>
<name>Company A</name>
<address>Some Place</address>
</company> <!--用实体的方法-->
<company>
<name>&comA;</name>
<address>&addA;</address>
</company>
</test>

  用Chrome打开:

  可见使用实体和直接写值的效果是一样的,实体所代表的值被浏览器代入。

文档类型定义——DOCTYPE

  文档类型声明,紧跟XML声明之后,包含所有实体声明。

  语法:

<?xml version="1.0" encoding="utf-8"?>

<!DOCTYPE 根元素标记名[

<!--实体声明-->

]>

  实例如上,实体部分。

处理指令PI

  处理指令用于XML解析器传递信息到应用程序。

  语法:<?目标 指令?>

  PI必须以一个叫做目标的标识符开头,这个标识符遵从如同元素和属性一样的规则,目标是指令所指向的应用的名称,指令是传递给应用程序的信息。

为XML文档编写样式单

  XML允许用户来创建任何所需要的标记。

  当然,由于用户在创建标记上有完全的自由,因而通用的浏览器无法预期用户标记的意义,也无法为显示这些标记而提供规则。

  因而,用户必须为文档编写样式单,告诉浏览器如何显示特定的标记。

  与标记集类似,用户创建的样式单可由不同的文档不同的人所共享,还可将自己创建的样式单与其他人编写的样式单集成在一起。

  比如编写样式hello.css:

GREETING{display:block; font-size:24pt; font-weight:bold

  加入样式的方法,是在XML文档中包括一个处理指令,指定所要使用的样式单:

<?xml-stylesheet type="text/css" href="hello.css"?>

  完整的XML文档如下:

<?xml version="1.0"  encoding="utf-8" standalone="yes"?>
<!--第一行是XML声明-->
<!--这是XML处理指令的例子。处理指令以<?开始,以?>结束-->
<!--在<?后的第一个单词是处理指令名,在本例中是xml-->
<!--处理指令一定要顶格写,前面不能有任何空白--> <!--另一个处理指令,表明要采用hello.css定义的样式
(使用当前目录下的hello.css)-->
<?xml-stylesheet type="text/css" href="hello.css"?> <students> <GREETING><!--开始标记--> Hello World<!--元素内容--> </GREETING><!--结束标记--> <student gender="male" isHandsome="true">
<id>001</id>
<name>zhangsan</name>
<address>Beijing</address>
<score>50</score>
</student> <student gender="female">
<id>002</id>
<name>lisi</name>
<address>北京</address>
<score/><!--为空的简写形式-->
</student> </students>

  通过样式,我们可以实现XML内容与展现形式的分离。

  为XML文档编写样式单可以用CSS或XSL,XSL比CSS复杂。

CDATA节

  用于把整段文本解释为纯字符数据而不是标记的情况。

  包含大量的<、>、&、或者"字符。CDATA节中的所有字符都会被当做元素字符数据的常量部分,而不是XML标记。

  语法:

<![CDATA[

......

]]>

  可以输入任意字符(除]]外),不能嵌套。

<?xml version="1.0" encoding="utf-8"?>
<root>
<![CDATA[ <hello>
<world> 这里放任何内容都是合法的 ]]> <subRoot> </subRoot>
</root>

XML DTD详解的更多相关文章

  1. XML DTD详解(转)

    前情提要与本文内容介绍 前面的两篇XML相关博文: 第一篇是介绍格式正规的XML: 格式正规的XML:语法 属性 实体 处理指令 样式单 CDATA节 第二篇介绍DTD,引入有效的XML的概念(符合语 ...

  2. sqlMapConfig.xml配置文件详解

    sqlMapConfig.xml配置文件详解: Xml代码 Xml代码  <? xml version="1.0" encoding="UTF-8" ?& ...

  3. XML文件详解以及解析

    转自:https://blog.csdn.net/com_ma/article/details/73277535 一.xml基础详解: 1.概述: xml:即可扩展标记语言,xml是互联网数据传输的重 ...

  4. web.xml 文件详解

    目录 1. web.xml各版本区别 2. web.xml配置详解 2.1 java web项目启动加载顺序 2.2 web.xml中定义的元素 web.xml文件是Java Web项目中的一个配置文 ...

  5. testNG xml文件详解

    网上看到一篇整理的非常详细的xml文件详解,分享一下: 1 <?xml version="1.0" encoding="UTF-8"?> 2 < ...

  6. Web.xml配置详解(转)

    Web.xml配置详解 Posted on 2010-09-02 14:09 chinaifne 阅读(295105) 评论(16) 编辑 收藏 1 定义头和根元素 部署描述符文件就像所有XML文件一 ...

  7. Mybatis系列全解(四):全网最全!Mybatis配置文件XML全貌详解

    封面:洛小汐 作者:潘潘 做大事和做小事的难度是一样的.两者都会消耗你的时间和精力,所以如果决心做事,就要做大事,要确保你的梦想值得追求,未来的收获可以配得上你的努力. 前言 上一篇文章 <My ...

  8. Java web.xml 配置详解

    在项目中总会遇到一些关于加载的优先级问题,近期也同样遇到过类似的,所以自己查找资料总结了下,下面有些是转载其他人的,毕竟人家写的不错,自己也就不重复造轮子了,只是略加点了自己的修饰. 首先可以肯定的是 ...

  9. java web.xml配置详解

    1.启动一个WEB项目的时候,WEB容器会去读取它的配置文件web.xml,读取<listener>和<context-param>两个结点. 2.紧急着,容创建一个Servl ...

随机推荐

  1. Cocos2d-x之Map<K, V>

    |   版权声明:本文为博主原创文章,未经博主允许不得转载. Map<K, V>是Cocos2d-x 3.0x中推出的字典容器,它也能容纳Ref类型.Map<K,V>是模仿C+ ...

  2. Intellij IDEA 智能补全的 10 个姿势,简直不能太牛逼!

    Java技术栈 www.javastack.cn 优秀的Java技术公众号 一年多前,栈长那时候刚从 Eclipse 转型 IDEA 成功,前面转了好多次,都是失败史,都是泪.. 后面我就在微信公众号 ...

  3. 阿里Druid连接池的坑。。

    Druid的坑 当查询数据库的Clob转换为Oracle Clob类型的时候. java.lang.ClassCastException: com.alibaba.druid.proxy.jdbc.C ...

  4. c# .netframwork 4.0 调用 2.0时报错 混合模式程序集是针对“v2.0.50727”版的运行时生成的,在没有配置其他信息的情况下,无法在 4.0 运行时中加载该程序集。

    “System.IO.FileLoadException”类型的未经处理的异常在 XXX.dll 中发生 其他信息: 混合模式程序集是针对“v2.0.50727”版的运行时生成的,在没有配置其他信息的 ...

  5. VUE $SET源码

  6. nginx之域名重定向

    一般网站默认的访问端口为80,当多个域名指向同一个服务器IP时,可以nginx进行重定向,分别指向不同的目的地址或其他主机. 在nginx目录下的conf/vhost子目录下建两个conf文件,hos ...

  7. HttpClient 之 4.x.x版本以上的发送Https请求

    https请求比http更安全 是在http的基础上加了SSL数据加密协议. http的连接很简单,是无状态的:HTTPS协议是由SSL+HTTP协议构建的可进行加密传输.身份认证的网络协议,比htt ...

  8. 【知识强化】第六章 查找 6.4 散列(Hash)表

    本节课我们来学习一种新的查找方式叫做散列查找.什么是散列查找呢?在学习散列查找之前,一定要介绍一个基本概念就是散列表.那么学习散列表之前我们先来回忆一下之前所学习过的所有查找方式,那么无论是顺序查找还 ...

  9. shell巡检草拟

    #!/bin/bash phy_cpu=$(cat /proc/cpuinfo | grep "physical id"|sort | uniq | wc -l) logic_cp ...

  10. 力扣——Next Permutation(下一个排列) python实现

    题目描述: 中文: 实现获取下一个排列的函数,算法需要将给定数字序列重新排列成字典序中下一个更大的排列. 如果不存在下一个更大的排列,则将数字重新排列成最小的排列(即升序排列). 必须原地修改,只允许 ...