xml基础之二(XML结构【2】)DTD文档模版

xml 模板 文档结构 

我们知道XML主要用于数据的存储和传输,所以无论是自定义还是外部引用DTD模板文档,都是为了突出数据的存储规范。DTD(文档模板)是预先使用合法元素定义好的文档结构,用于给XML文件编写提供模板,即引用该某种DTD文档后,XML文档必须按照其结构进行编写,否则出错。DTD模板现在正被schema模式代替,在此我们对DTD大致了解一下,方便对schema模式进行学习。

1.DTD声明的形式

DTD可以声明在XML文档中;也可以在外部声明,然后在XML进行引用。

外部DTD文档复用性高,不像内部DTD仅用于某一文档的验证,推荐使用外部DTD定义。

使用DTD可预先定义好XML文档结构:
1.提供开发模板方便开发
2.对数据交互有清晰的了解,从而控制开发流程。

  1. 内部声明
    如若DTD被声明在XML源文件中,它的位置应处于文档声明以及XML元素/结点声明之间
        <?xml version="1.0" encoding="ISO-8859-1"?> <!--文档声明-->
<!--DTD声明-->
<! DOCTYPE 根元素 [结点声明]>
<node> <!--结点声明-->
<child>
<!--更多子结点-->
</child>
</node>

范例

<?xml version="1.0" encoding="ISO-8859-1"?>			<!--文档声明/定义-->
<!--<! DOCTYPE 根元素 [结点声明]>-->
<!--<!ELEMENT xx type> 声明/定义某个结点的类型-->
<!DOCTYPE note [
<!ELEMENT note (to,from,heading,body)>
<!ELEMENT to (#PCDATA)>
<!ELEMENT from (#PCDATA)>
<!ELEMENT heading (#PCDATA)>
<!ELEMENT body (#PCDATA)>
]>
<note>
<to>George</to>
<from>John</from>
<heading>Reminder</heading>
<body>Don't forget the meeting!</body>
</note>
  1. 外部声明,内部引用
    使用软件编写DTD,然后在XML文件中进行引用,引用格式如下:
<!--在XML中使用DTD,编码格式一般为UTF-8,如果编码为IOS-8859-1,则为西方文字存储格式,不适用象形文字,如果文档出现中文会乱码-->
<?xml version="1.0" encoding="UTF-8"?> <!--文档声明-->
<!-- ! DOCTYPE 根结点 SYSTEM "引用DTD文件名"-->
<! DOCTYPE 根结点 SYSTEM "引用DTD文件名">
<node> <!--结点声明-->
<child>
<!--更多子结点-->
</child>
</node>

范例

    <!--该DTD模板名为myNode-->
<!ELEMENT> node(child,subchild)>
<!ELEMENT child (#PCDATA)>
<!ELEMENT subchild (#PCDATA)>
    <?xml version="1.0" encoding="ISO-8859-1"?> <!--文档声明,请注意encoding,与UTF-8对比-->
<!DOCTYPE node SYSTEM "myNode">
<node>
<child>
<subchild>
</subchild>
<child>
</node>

2.DTD模板内的XML模块结构

我们在https://www.cnblogs.com/singledogpro/p/9644125.html 对XML结构进行了笼统地介绍,再次对该结构进行细致地描述。
我们可以将XML结构分为5个模块,分别是元素,属性,实体,PCDATA(可解析替换的数据)和CDATA。

1.回顾上面的知识点,可知元素【被包裹在开始标签和结束标签的内容】可为空,也可含文本和其他模块。

    <node></node> <!--空元素-->
<node id="1"></node> <!--含属性的元素-->
<node>i'm a node</node> <!--含文本的元素-->

2.能为元素提供额外的信息就被称为属性。属性都放在开始标签内,以键/值的形式存在。

<node id="1"></node> <!--node标签内含属性,属性键为id,值为1-->

3.实体其实概念和字符串常量一样,在另一个文件中定义了一个变量等于某个字符串,然后在XML中就可以直接使用此变量了。这个变量就叫做实体。比如XML系统文件内的5个自定义的变量/实体引用。在某个文件内定义某个变量/实体等于某个字符串,如变量 ;lgt=">".当文档被 XML 解析器解析时,实体就会被展开,将XML的元素替换成一个文件内的字符串常量的过程叫实体展开。


| &gt; | > | great than |
| &lt; | < | less than |
| &amp; | & | ampersand |
| &apos; | ' | apostrophe |
| &quot; | '' | quotation mark |

4.PCDATA和CDATA,PCDATA是元素类型,CDATA是属性类型,在属性定义时,属性文本可想象为 XML 元素的开始标签与结束标签之间的文本,这些文本将被解析器检查实体以及标记,文本中的标签会被当作标记来处理,而实体会被展开。由于某些字符被系统占用了,如小于号"<",为了能在文本中正确显示小于号,只能拼凑一段字母来代表其意义。

    
<!--<!ELEMENT 元素名(#PCDATA)>-->
<node> a root node</node> <!--PCDATA--> <!--<!ATTLIST 元素名 属性名 CDATA>-->
<node id="1"> root的ID为1 </node>

3.DTD模板内的XML元素声明

要知道元素分为根元素和子元素两大类,根元素声明包括定义子元素的个数和次序。

DTD文档的元素声明语法其中ELMENT为关键字,必须大写,elementName指代元素名,elementType为元素类型。

<!ELEMENT elementName elementType>
元素类型 类型描述 语法 表现形式
EMPTY 空元素,即该元素没有子元素和文本,指示该元素为最小子元素简写为</元素名> <!ELEMENT a EMPTY> </a>
ANY 该类型元素没有任何定义限制,即可元素个数和次序随意编写,不推荐使用 <!LLEMENT a ANY>  
#PCDATA 该元素仅含文本,没有子元素 <!LLEMENT a (#PCDATA)> <a>元素文本</a>
纯元素类型 与#PCDATA相反,该元素类型仅含子元素,不含文本,但子元素可含文本  

<a>

  <b>元素文本</b>

</a>

元素修饰符 对元素的出现次数进行限定    详见子元素声明

1.根元素声明

<!--以!ELEMENT开头,跟着根元素名 ,再跟着子元素列表,该列表决定了子元素的出现顺序不可乱-->
<!ELEMENT 根元素/结点 (子元素列表)> <!--根元素声明语法 三个模块之间用空格隔开-->
<!ELEMENT root (head,body,foot)> <!--根元素实例-->

2.子元素声明
子元素声明有2种格式,一种还有子元素的,一种没有子元素的。有子元素的子元素声明与根元素声明类似,没有子元素的,声明其元素类型,为空(empty),为可解析数据(PCDATA),为仅出现一次的元素(子元素名称),为最少出现一次的元素(子元素名称+),或者出现或者不出现的元素(子元素名称*)等以及要么出现A这个要么出现B的(A|B);

<!--子元素声明有2种格式,一种还有子元素的,一种没有子元素的-->
<!ELEMENT 根元素/结点 (子元素列表)> <!--有子元素的子元素声明,与根元素声明类似-->
<!ELEMENT root (head,body,foot)> <!--给定某个根元素序列-->
<!ELEMENT head (eye,ear,nose,mouth)> 有子元素的子元素声明
<root> <!--根元素结点-->
<head><!--子元素结点-->
<eye><!--子元素的子元素结点-->
</eye>
<ear><!--子元素的子元素结点-->
</ear>
<nose><!--子元素的子元素结点-->
</nose>
<mouth><!--子元素的子元素结点-->
</mouth>
</head>
</root> <!ELEMENT 根元素/结点 (子元素类别)> <!--没有子元素的子元素声明,括号内为元素类别-->
<!ELEMENT head (eye,ear,nose,mouth)><!--给定某个根元素序列-->
<!ELEMENT eye (#PCDATA)> 没有子元素的子元素声明实例
<head><!--子元素结点-->
<eye><!--子元素的子元素结点-->
这是眼睛
</eye>
</head>

4.属性

XML元素内包含属性,所以DTD内属性也需要声明。关键字ATTLIST全部要大写,attribute list(属性列表)简化为ATT LIST。

<!ATTLIST 元素名 属性键/属性名 属性类型 默认属性值> <!--某元素结点的属性DTD声明格式-->
<!ATTLIST head decription CDATA "这是头" > <!--头元素结点的属性XML案例-->
<head description ="这是头">

上述DTD模板文档定义了头的概念。然后在XML文档对其进行复用。其中属性类型由系统提供,常用的为CDATA,ID,ENTITY以及xml:默认属性值是DTD文件默认值,在XML文件中可进行修改,上述关于头的XML案例,也可修改为<head description ="动物的核心部件">
该默认值也可使用属性约束符,如#REQUIRED(属性值是必需的,不能为空),#IMPLIED(属性不是必需的,可以为空),#FIXED value(属性值是固定的,不能被修改)

<!--属性定义语法-->
<!ATTLIST 元素名称 属性名称 属性类型 #FIXED "value">
<!ATTLIST 元素名称 属性名称 属性类型 #IMPLIED>
<!ATTLIST 元素名称 属性名称 属性类型 #REQUIRED> <!--DTD文档属性定义-->
<!ATTLIST student id CDATA #REQUIRED>
<!ATTLIST connection phoneNumber CDATA #IMPLIED>
<!ATTLIST connection address CDATA #FIXED "xx村"> <!--XML实现-->
<student id="440xxxx">
<connection phoneNumber ="020-xxxx">
<connection address="xx村">

上述描述了一个(固定的属性)身份证号的人,他住在(必需的属性)xx村,可有可没有电话号码.即在DTD文档内进行约束定义,在XML进行实现。可想象成定义公民的权力和义务,一般公民有选举权,犯罪人员可能被剥夺了政治权,还需要劳动改造。

5.变量/实体声明

我们可以完全将实体当作是变量。它的声明也有2种。一种是在XML内部声明,另一种是在DTD(模板文件)声明。假设仓库/数据库内有一本Book叫Code,它的Price是9.9元。那么我们就有2个实体变量Book和Price.其值为Code和9.9,要用双引或单引号包裹。要它在商城显示为书名和价格

<!ENTITY 变量名 变量值> <!--XML文件内部变量声明-->
<!ENTITY Book "Code">
<!ENTITY Price "9.9"> <!--XML文件内使用,一个变量的引用由3部分组成,一个和号 (&), 一个变量名, 以及一个分号 (;)-->
<BookStore>
&Book;&Price;
</BookStore>
<!ENTITY 变量名 SYSTEM "url"> <!--外部声明,声明变量Book,它的声明来源为某个网站的DTD文件-->

<!ENTITY Book SYSTEM "http://www.taobao.com/dtd/entities.dtd".>
<!ENTITY Price SYSTEM "http://www.taobao.com/dtd/entities.dtd".> <!--与XML文件内使用相-->
<BookStore>
&Book;&Price;
</BookStore>

6.自定义的DTD文档

这里我们尝试定义下头的DTD文档,以及XML案例,这里要注意下格式,变量/实体声明要放在元素之前,属性声明放在元素之后。

<!--DTD文档-->
<!DOCTYPE root [
<!--变量/实体声明要放在元素之前,此处为空-->
<!ELEMENT root (head,body,foot)> <!--给定根元素的序列-->
<!ELEMENT head (eye,ear,nose,mouth)><!--给定子元素'头'的序列-->
<!ELEMENT eye (#PCDATA)> <!--子元素没有子元素,只有文本--> <!ATTLIS root decription CDATA "简单展示"> <!--属性放在元素声明之后-->
]> <!--外部引用XML文档-->
<root decription=“简单展示”>
<head><!--子元素结点-->
<eye><!--子元素的子元素结点-->
这是眼睛
</eye>
</head>
</root>

7.总结

DTD可称为XML文件的模板文档,但由于它不支持数据类型和命名空间,没有Schema(XML模型)的扩展性好,所以逐渐被schema替代。下个章节将介绍Schema,XML模型。它与DTD类似。

xml基础之二(XML结构【2】)DTD文档模版的更多相关文章

  1. xml基础之二(XML结构【1】)

    xml基础之二(XML结构[1]) 新建 模板 小书匠  XML结构 XML结构 1.1 元素:被开始标签和结束标签所包裹的内容,(红色部分),蓝色部分也是元素,由于其仅有词语和句子,可细分为文本元素 ...

  2. 《MATLAB从入门到放弃》二维曲线和图形绘制基础(二):使用Help文档学习line、plot、plotyy、subplot、hold绘图函数

    目录: »  plot 最常用的二维曲线绘图函数 >  帮助文档 >  基本使用语法 >  线条的样式.符号和颜色调整 >  图形属性调整 >  使用图形句柄进行设置 » ...

  3. XML基础+Java解析XML +几种解析方式的性能比较

    XML基础+Java解析XML 一:XML基础 XML是什么: 可扩展的标记语言 XML能干什么: 描述数据.存储数据.传输(交换)数据. XML与HTML区别: 目的不一样 XML 被设计用来描述数 ...

  4. XML学习总结(二)——XML入门

    XML学习总结(二)——XML入门 一.XML语法学习 学习XML语法的目的就是编写XML 一个XML文件分为如下几部分内容: 文档声明 元素 属性 注释 CDATA区 .特殊字符 处理指令(proc ...

  5. 课时14.DTD文档声明上(掌握)

    1.什么是DTD文档声明? 由于HTML有很多格版本的规范,每个版本的规范之间又又一些差异,所以为了让浏览器能够正确的编译/解析/渲染我们的网页,我们需要在HTML文件的第一行告诉浏览器,我们当前这个 ...

  6. 课时15.DTD文档声明下(了解)

    W3C的官方网站是W3School,我们可以去官方网站查询DTD文档声明. HTML4.01       Strict  非常严谨的 如果你写了这个DTD文档声明,你就不能写如下样式: <fon ...

  7. SpringSecurity权限管理系统实战—二、日志、接口文档等实现

    系列目录 SpringSecurity权限管理系统实战-一.项目简介和开发环境准备 SpringSecurity权限管理系统实战-二.日志.接口文档等实现 SpringSecurity权限管理系统实战 ...

  8. XML详解二XML的解析与创建

    XML用来传输和存储数据,如何解析获取到的XML文本呢? 一.解析XML 创建demo.xml文件: <?xml version="1.0" encoding="U ...

  9. C# XML基础入门(XML文件内容增删改查清)

    前言: 最近对接了一个第三方的项目,该项目的数据传输格式是XML.由于工作多年只有之前在医疗行业的时候有接触过少量数据格式是XML的接口,之后就几乎没有接触过了.因此对于XML这块自己感觉还是有很多盲 ...

随机推荐

  1. adb常用命令和抓取log的方法

    一 adb常用的几个命令1. 查看设备adb devices这个命令是查看当前连接的设备, 连接到计算机的android设备或者模拟器将会列出显示 C:\Documents and Settings\ ...

  2. AcWing 875. 快速幂

    题目链接:https://www.acwing.com/problem/content/description/877/ 快速幂模板题,计算ab mod p 的值,a,b,p大概1e9左右,可以快速计 ...

  3. 题解 CF1140D 【Minimum Triangulation】

    题意:求将一个n边形分解成(n-2)个三边形花费的最小精力,其中花费的精力是所有三角形的三顶点编号乘积的和(其中编号是按照顶点的顺时针顺序编写的) 考虑1,x,y连了一个三角形,x,y,z连了一个三角 ...

  4. HNUSTOJ-1639 分糖果(几何)

    1639: 分糖果 时间限制: 1 Sec  内存限制: 128 MB提交: 261  解决: 118[提交][状态][讨论版] 题目描述 为了实验室的发展,吴大大采购了一箱零食O(∩_∩)O~~ 在 ...

  5. Vue:Elementui中的Tag与页面其它元素相互交互的两三事

    前言 公司系统在用elementui做后台开发,不免遇到一些需要自己去根据原有的功能上,加一些交互的功能.今天来介绍下我在用elementUi里的Tag标签与多选框交互的过程,东西听上去很简单,但就是 ...

  6. Androidstudio中添加jar包

    1.先到网上下载你需要的jar包,下载下来后,将你Androidstudio中的项目切换为project 2.找到app下的libs,将你下载的jar包复制粘贴进去 3.jar包复制进去后,选中你的j ...

  7. mpg123 - 播放 MPEG 1.0/2.0 Layer-1, -2, -3 音频文件

    语法 mpg123 [ -tscvqy01m24 ][ -b size ][ -k num ][ -n num ][ -f factor ][ -r rate ][ -g gain ][ -a dev ...

  8. 北京师范大学第十五届ACM决赛-重现赛D Disdain Chain (规律+组合数学)

    链接:https://ac.nowcoder.com/acm/contest/3/D 来源:牛客网 Disdain Chain 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 2621 ...

  9. keras数据增强

    1.keras数据增强:https://www.cnblogs.com/hutao722/p/10075150.html 2 .keras fit 中的 verbose verbose:日志显示ver ...

  10. mac下安装 rabbitMq

    1.安装HomeBrew,如果已经安装这一步跳过. 2.用brew install rabbitmq指令即可进行rabbitmq服务的自动安装. 3.安装完成之后会出现一下提示:   rabbit安装 ...