XML(三)-DTD详细讲解

XML DTD详解

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

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

元素的定义

DTD中的修饰符号:

属性的定义:

属性类型——CDATA

<!ATTLIST title name CDATA #REQUIRED>

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

属性类型——ID

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE pets [
<!ELEMENT pets (dog+,penguin)>
<!ELEMENT dog (id,name,health,love,strain)>
<!ELEMENT penguin (id,name,health,love,sex)>
<!ELEMENT id (#PCDATA)>
<!ELEMENT name (#PCDATA)>
<!ELEMENT health (#PCDATA)>
<!ELEMENT love (#PCDATA)>
<!ELEMENT strain (#PCDATA)>
<!ELEMENT sex (#PCDATA)>
<!ATTLIST dog id ID #REQUIRED>
]>
<pets>
    <dog id="d01">
            <id>d01</id>
            <name>安倍晋三</name>
            <health>100</health>
            <love>100</love>
            <strain>草狗</strain>
    </dog>
    <dog id="d02">
            <id>d01</id>
            <name>安倍晋三</name>
            <health>100</health>
            <love>100</love>
            <strain>草狗</strain>
    </dog>
    <penguin>
            <id>p01</id>
            <name>妮妮</name>
            <health>100</health>
            <love>100</love>
            <sex>100</sex>
    </penguin>
</pets>

这里<!ATTLIST dog id ID #REQUIRED> 表名dog元素有一个属性名为id,它的类型是ID,要求id不能重复

属性类型——IDREF/IDREFS

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE family [
<!ELEMENT family (person+)>
<!ELEMENT person EMPTY>
<!ATTLIST person   relID ID #REQUIRED    parentID IDREFS #IMPLIED    name CDATA #REQUIRED>
]>
<family>
    <person relID="p01" name="爸爸"/>
    <person relID="p02" name="妈妈"/>
    <person relID="p03" name="小明" parentID="p03 p02"/>
</family>

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

属性类型——NMTOKEN/NMTOKENS

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE poem[
<!ELEMENT poem (title+,content)>
<!ELEMENT title (#PCDATA)>
<!ELEMENT content (#PCDATA)>
<!ATTLIST title author NMTOKEN #REQUIRED>
]>
<poem>
    <title author="zhangsan">001</title>
    <title author="李 四">001</title>
    <content>123</content>
</poem>

以上代码有问题,李四中间加了空格

属性类型——Enumerated

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

  

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE poem[
<!ELEMENT poem (title+,content)>
<!ELEMENT title (#PCDATA)>
<!ELEMENT content (#PCDATA)>
<!ATTLIST title author (zhangsan|lisi|wangwu) #REQUIRED>
]>
<poem>
    <title author="zhangsan">001</title>
    <title author="lisi">001</title>
    <content>123</content>
</poem>
author的属性值必须在 zhangsan|lisi|wangwu 中的任意一个

属性的特点

#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关键字,则为内部实体,表示实体指代内容为字符串。

时间: 2024-10-10 23:19:26

XML(三)-DTD详细讲解的相关文章

(转)JAVA AJAX教程第三章—AJAX详细讲解

现在开始深入AJAX,这里还是按老思路,理论和实践相结合.这章的内容主要是讲解AJAX步骤详解,下一张将会用一个AJAX技术实现页面提示效果的实例来说明AJAX的实现. 一.AJAX步骤详解 AJAX实质上是遵循Request/Server模式来进行工作的,这个框架基本的流程包括下面几个具体的步骤: (1)       XMLHttpRequest对象初始化 (2)       发送请求 (3)       服务器接收请求并进行处理 (4)       服务器返回响应数据 (5)       客

(三)Jquery Mobile按钮详细讲解

Jquery Mobile按钮详细讲解 一.JM按钮说明 按钮如下图所示           1.HTML5中的button      效果:      2. JM中的普通button              此中显示和HTML5是系统的.      3.JM中button内联样式 data-inline      说到内联样式和block样式,大家估计都不知道怎么回事,内联inline是说,外面的框会根据内部的文字来改变,block则正好相反,上面展示的按钮占据了整个一行的效果,现在我们需要

JSP的静态包含和动态包含详细讲解 (一)

JSP包含有两种方式:静态包含和动态包含.下面我们将通过JSP运行的特点(转换为servlet再执行)来比较二者的区别. 一.静态包含  <%@include file="url"%> 我们先写一个正常的小项目,来看下静态包含是如何运行的. 测试一: top.jsp页面: <%@ page language="java" contentType="text/html; charset=UTF-8"     pageEncodin

jqm的多列布局demo,html5的多列布局demo,多列布局的详细讲解,html5开发实例详解

由于移动设备屏幕宽度较小,所以一般不建议使用多列布局.但有时你可能需要并排放置一些元素(如按钮之类的). jQuery Mobile通过约定的类名ui-grid来提供了一种基于css的多列布局方法.共提供了五种布局方式,分别是:ui-gird-solo:单列布局,ui-gird-a:双列布局,ui-gird-b:三列布局,ui-gird-c:四列布局,ui-gird-d:五列布局.布局网格总宽度100%,完全不可见(无边框无背景),没有任何内边距或外边距,不会对网格中的内容产生任何干扰. 今天我

【PHP XML与dtd概述【完整版】】

一.XML文件简介 关于XML的大多数人都知道一些,HTML->xhtml->xml,这个顺序本来应当是HTML发展的顺序. XML可以当做配置文件使用,还可以充当小型的数据库. version:文档符合xml1.0规范,我们学习的一般都是1.0encoding:文档字符编码,比如gb2312,一般使用utf-8standalone:文档定义是否独立使用standalone="yes",表名文档独立使用standalone="no":默认 XML文档有且

MyBatis Generator 详细讲解

MyBatis Generator中文文档 MyBatis Generator中文文档地址: http://mbg.cndocs.tk/ 该中文文档由于尽可能和原文内容一致,所以有些地方如果不熟悉,看中文版的文档的也会有一定的障碍,所以本章根据该中文文档以及实际应用,使用通俗的语言来讲解详细的配置. 本文中所有节点的链接都是对应的中文文档地址,可以点击查看详细信息. 注:本文后面提到的MBG全部指代MyBatis Generator. 运行MyBatis Generator 有4种运行MBG的方

[iOS]数据库第三方框架FMDB详细讲解

[iOS]数据库第三方框架FMDB详细讲解 初识FMDB iOS中原生的SQLite API在进行数据存储的时候,需要使用C语言中的函数,操作比较麻烦.于是,就出现了一系列将SQLite API进行封装的库,例如FMDB.PlausibleDatabase.sqlitepersistentobjects等. FMDB是一款简洁.易用的封装库.因此,在这里推荐使用第三方框架FMDB,它是对libsqlite3框架的封装,用起来的步骤与SQLite使用类似,并且它对于多线程的并发操作进行了处理,所以

详细讲解Android的网络通信(HttpUrlConnection和HttpClient)

前言,Android的网络通信的方式有两种:使用Socket或者HTTP,今天这一篇我们详细讲解使用HTTP实现的网络通信,HTTP又包括两种方式编程方式: (1)HttpUrlConnection: (2)HttpClient: 好了,我们直接进行讲解,当然之前也会有一部分有关Android网络通信的其他知识,我们也应该了解. 一.获取网络状态的方法 (1)MainActivity.java中的关键代码 1 2 3 4 5 6 7 8 //网络管理类,可以判断是否能上网,以及网络类型     

Spark SQL操作详细讲解

一. Spark SQL和SchemaRDD 关于Spark SQL的前生就不再多说了,我们只关注它的操作.但是,首先要搞明白一个问题,那就是究竟什么是SchemaRDD呢?从Spark的Scala API可以知道org.apache.spark.sql.SchemaRDD和class SchemaRDD extends RDD[Row] with SchemaRDDLike,我们可以看到类SchemaRDD继承自抽象类RDD.官方文档的定义是"An RDD of Row objects tha