热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

XML三部曲之拨云见日DTD(二)

上篇博客讨论了文件定义格式的基本用法,即DTD中元素和实体的声明语法,同时讨论了DTD中为了避免命名冲突而引入的命名空间和前缀标识。DTD同时为我们提供了一种节省时间的方法
       上篇博客讨论了文件定义格式的基本用法,即DTD中元素和实体的声明语法,同时讨论了DTD中为了避免命名冲突而引入的命名空间和前缀标识。DTD同时为我们提供了一种节省时间的方法,它的功能很类似于抽象类,接下来将着重讨论实体机制。
一. 实体详解


    有了元素为什么还要引入实体呢?要想区分两者,首先要看实体引入的目的。实体机制是一种节省大量时间的工具,将多种不同类型的数据并入XML文档的方法。它就好像是面向对象的抽象类一样,把经常使用的抽象成一个实体,在使用它的地方可以直接引用,避免了重复。     详细的说      (1)代替无法输入的字符,键盘只有26个字母和一些简单的标点符号,而字符集中有成N多各种符号是无法在键盘中输入的。     (2)代替一些与xml规范保留字相冲突的内容,如:<> 等等。      (3)代替大段的重复的文本。    实体引用按照引用的位置分为内部和外部两种,按照引用的内容分为一般和参数引用两种。下面看一个外部实体引用的实例:

    清单1:“2.dtd”的声明












      清单2:影评.xml的内容

<影评>
这些影评都是由XXX公司出品,值得观看!

     清单3:使用dtd的xml文件中的内容。

<影评>
这些影评都是由XXX公司出品,值得观看!


清单3:使用dtd的xml文件中的内容。


<影片目录>
<影片 类别="武侠" 年份="2008">
<片名>十面埋伏
<主演>刘德华、金城武、章子怡
<导演>张艺谋
<简介>&十面埋伏;

<影片 类别="武侠" 年份="2006">
<片名>霍元甲
<主演>李连杰
<导演>于仁泰
<简介>&霍元甲;

&filmcomment;
     
      清单4:使用IE8打开清单3后的内容


- <影片目录>
- <影片 类别="武侠" 年份="2008">
<片名>十面埋伏
<主演>刘德华、金城武、章子怡
<导演>张艺谋
<简介>漫天大雪,三人在雪中决斗

- <影片 类别="武侠" 年份="2006">
<片名>霍元甲
<主演>李连杰
<导演>于仁泰
<简介>民族英雄,与西方帝国主义抗争

<影评>这些影评都是由XXX公司出品,值得观看!
     内部和外部很容易理解,主要看一般和参数两种引用的区别。

   1.参数实体


         清单1:test.dtd,在此该内容单独存在了一个dtd文件中是因为在内部DTD子集中。
        参数实体引用不能在标记声明内部出现,可以在标记声明允许出现的地方出现。然而,对于外部DTD子集,则没有这个限制。






         清单2:学校信息.xml文件,引用了外部的test.dtd文件





<学校信息>
<学生信息>
<姓名>张三
<性别>男
<出生日期>2013-10-12

<教师信息>
<姓名>张三
<性别>男
<出生日期>2013-10-12

<员工信息>
<姓名>张三
<性别>男
<出生日期>2013-10-12

       
      清单3:使用IE8打开清单2的内容后

-

-
- <学校信息>
- <学生信息>
<姓名>张三
<性别>男
<出生日期>2013-10-12

- <教师信息>
<姓名>张三
<性别>男
<出生日期>2013-10-12

- <员工信息>
<姓名>张三
<性别>男
<出生日期>2013-10-12


 

 2. 一般实体


    可在XML元素中加以引用,也可以在DTD中引用,但参数实体只能在DTD中引用,并且通常情况下只能在外部DTD文档中引用。

   3. 对比升华


参数实体与一般实体的区别如下:


     (l)在定义参数实体时,实体名前必须加一个“%”号。

     (2)参数实体引用以“%”开始,而不是一般实体引用的“&”。

     (3)参数实体的内容不仅可以包含文本,还可以包含标记。

     (4)参数实体只能应用于DTD,而不能在文档本体中引用。即参数实体只能用来构成DTD的内容,而不能构成文档内容。

     (5)参数实体只能在外部DTD文档中使用,无法应用于内部DTD。


外部参数实体与外部一般实体的区别如下:


     (1)外部参数实体应用于独立的DTD文档,外部一般实体应用于XML文档。

     (2)外部参数实体应用于将多个独立的DTD文档组合为一个大的DTD文档,外部一般实体用于将多个独立的XML文档组合成一个大的XML文档。


二. 验证XML文件的合法性

    DTD定义了XML文件的使用格式,它从结构和形式上限制了XML文档,通过引用DTD可以形成统一的规范化的XML文档,另外通过使用实体简化了DTD和XML文档的内容。使用DTD验证的XML文档才能称为规范化文档,那如何验证所写的XML文档是否符合DTD的规范呢。通过如下的代码串:
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;

import org.xml.sax.InputSource;

public class ValidateDTD
{
public static void main(String[] args){

//在验证前需要把需要验证的XML和规范DTD包含在jar中
try{
DocumentBuilderFactory dbf=DocumentBuilderFactory.newInstance();//创建一个文档构造工厂
dbf.setValidating(true);
DocumentBuilder builder=dbf.newDocumentBuilder();
builder.parse(new InputSource("xml-2-2.xml"));//需要验证的XML名称
}catch(Exception e){
e.printStackTrace();
}
}
}


       上面代码中的类和结构主要完成了XML文档的解析,并且在解析之前验证当前XML文件是否符合某个DTD的定义。在上面的代码运行前需要将需要验证的XML和提供规范化的DTD文档引入到当前ValidateDTD项目中,后运行上面的代码实例,该项目会在项目文件中自动查找规范的DTD,然后验证xml文件。

三. 结语      
        至此,有关文件定义格式的内容已经基本上讨论了一遍,从最初的元素声明到复杂多变的实体类型,DTD的引入无疑为XML的使用指定了一个统一的标准,这种标准是由提供方规定好,使用方遵守的一种规则,并在最后讨论了如何验证引用DTD的XML合法与否。另外描述XML文档结构的不仅仅只有DTD,DTD是一种早期的定义格式,它有很多缺点,如不支持数据类型,不易于扩展等,为了避免这种缺点后来又引入了Schema,它是DTD的继任者,下篇博客将着重讨论Schema。



推荐阅读
  • XML介绍与使用的概述及标签规则
    本文介绍了XML的基本概念和用途,包括XML的可扩展性和标签的自定义特性。同时还详细解释了XML标签的规则,包括标签的尖括号和合法标识符的组成,标签必须成对出现的原则以及特殊标签的使用方法。通过本文的阅读,读者可以对XML的基本知识有一个全面的了解。 ... [详细]
  • 本文介绍了使用kotlin实现动画效果的方法,包括上下移动、放大缩小、旋转等功能。通过代码示例演示了如何使用ObjectAnimator和AnimatorSet来实现动画效果,并提供了实现抖动效果的代码。同时还介绍了如何使用translationY和translationX来实现上下和左右移动的效果。最后还提供了一个anim_small.xml文件的代码示例,可以用来实现放大缩小的效果。 ... [详细]
  • Spring特性实现接口多类的动态调用详解
    本文详细介绍了如何使用Spring特性实现接口多类的动态调用。通过对Spring IoC容器的基础类BeanFactory和ApplicationContext的介绍,以及getBeansOfType方法的应用,解决了在实际工作中遇到的接口及多个实现类的问题。同时,文章还提到了SPI使用的不便之处,并介绍了借助ApplicationContext实现需求的方法。阅读本文,你将了解到Spring特性的实现原理和实际应用方式。 ... [详细]
  • 本文介绍了Java高并发程序设计中线程安全的概念与synchronized关键字的使用。通过一个计数器的例子,演示了多线程同时对变量进行累加操作时可能出现的问题。最终值会小于预期的原因是因为两个线程同时对变量进行写入时,其中一个线程的结果会覆盖另一个线程的结果。为了解决这个问题,可以使用synchronized关键字来保证线程安全。 ... [详细]
  • 自动轮播,反转播放的ViewPagerAdapter的使用方法和效果展示
    本文介绍了如何使用自动轮播、反转播放的ViewPagerAdapter,并展示了其效果。该ViewPagerAdapter支持无限循环、触摸暂停、切换缩放等功能。同时提供了使用GIF.gif的示例和github地址。通过LoopFragmentPagerAdapter类的getActualCount、getActualItem和getActualPagerTitle方法可以实现自定义的循环效果和标题展示。 ... [详细]
  • 个人学习使用:谨慎参考1Client类importcom.thoughtworks.gauge.Step;importcom.thoughtworks.gauge.T ... [详细]
  • 本文详细介绍了Java中vector的使用方法和相关知识,包括vector类的功能、构造方法和使用注意事项。通过使用vector类,可以方便地实现动态数组的功能,并且可以随意插入不同类型的对象,进行查找、插入和删除操作。这篇文章对于需要频繁进行查找、插入和删除操作的情况下,使用vector类是一个很好的选择。 ... [详细]
  • springmvc学习笔记(十):控制器业务方法中通过注解实现封装Javabean接收表单提交的数据
    本文介绍了在springmvc学习笔记系列的第十篇中,控制器的业务方法中如何通过注解实现封装Javabean来接收表单提交的数据。同时还讨论了当有多个注册表单且字段完全相同时,如何将其交给同一个控制器处理。 ... [详细]
  • 猜字母游戏
    猜字母游戏猜字母游戏——设计数据结构猜字母游戏——设计程序结构猜字母游戏——实现字母生成方法猜字母游戏——实现字母检测方法猜字母游戏——实现主方法1猜字母游戏——设计数据结构1.1 ... [详细]
  • [大整数乘法] java代码实现
    本文介绍了使用java代码实现大整数乘法的过程,同时也涉及到大整数加法和大整数减法的计算方法。通过分治算法来提高计算效率,并对算法的时间复杂度进行了研究。详细代码实现请参考文章链接。 ... [详细]
  • Java学习笔记之面向对象编程(OOP)
    本文介绍了Java学习笔记中的面向对象编程(OOP)内容,包括OOP的三大特性(封装、继承、多态)和五大原则(单一职责原则、开放封闭原则、里式替换原则、依赖倒置原则)。通过学习OOP,可以提高代码复用性、拓展性和安全性。 ... [详细]
  • 在Xamarin XAML语言中如何在页面级别构建ControlTemplate控件模板
    本文介绍了在Xamarin XAML语言中如何在页面级别构建ControlTemplate控件模板的方法和步骤,包括将ResourceDictionary添加到页面中以及在ResourceDictionary中实现模板的构建。通过本文的阅读,读者可以了解到在Xamarin XAML语言中构建控件模板的具体操作步骤和语法形式。 ... [详细]
  • 本文介绍了解决Netty拆包粘包问题的一种方法——使用特殊结束符。在通讯过程中,客户端和服务器协商定义一个特殊的分隔符号,只要没有发送分隔符号,就代表一条数据没有结束。文章还提供了服务端的示例代码。 ... [详细]
  • 本文介绍了OC学习笔记中的@property和@synthesize,包括属性的定义和合成的使用方法。通过示例代码详细讲解了@property和@synthesize的作用和用法。 ... [详细]
  • CF:3D City Model(小思维)问题解析和代码实现
    本文通过解析CF:3D City Model问题,介绍了问题的背景和要求,并给出了相应的代码实现。该问题涉及到在一个矩形的网格上建造城市的情景,每个网格单元可以作为建筑的基础,建筑由多个立方体叠加而成。文章详细讲解了问题的解决思路,并给出了相应的代码实现供读者参考。 ... [详细]
author-avatar
PrinceVince_820
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有