XML DTD详解
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;©right;</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;©right;</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>