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

XML(二)之DTD——XML文件约束

前面介绍了XML的作用和基本的格式,今天我给大家分享的是关于XML的约束。废话不多说,我们直接来正题!一、DTD简介1.1、DTD概述DTD(DocumentTypeDefinition,文档

前面介绍了XML的作用和基本的格式,今天我给大家分享的是关于XML的约束。废话不多说,我们直接来正题!

一、DTD简介

1.1、DTD概述

  DTD(Document Type Definition,文档类型定义)

  1)DTD是一套关于标记符的语法规则。它是XML1.0版规格的一部分,是XML文件的验证机制,属于XML文件组成的一部分
  2)XML文件提供应用程序一个数据交换的格式,DTD正是让XML文件能够成为数据交换的标准,因为不同的公司只需定义好标准的DTD,

    各公司都能够依照DTD建立XML文件,并且进行验证,如此就可以轻易的建立标准和交换数据,这样满足了网络共享和数据交互。
  4)DTD中的所有约束都是针对 与某个标签的子标签进行约束的

  注意:除了DTD约束,其实还有其他的约束。Schema(模式)约束:用xml写的文件,然后用来约束xml文件

1.2、DTD的目的

  验证XML文档是不是一个有效的XML文档。
  有效:如果一个良构的XML文档满足了dtd的声明,就是一个有效的XML文档。
  有效一定良构,良构不一定有效。

1.3、XML文档引入DTD的方式

  1)引入内部DTD

  DOCTYPE 根元素[
  DTD验证规则/实体定义...
  ]
>

  2)引入外部DTD

  当引用的文件在本地时:

  当引用文件是一个公共文件(DTD文件存在于远程服务器上)时:

1.4、DTD约束原理

  

  注:通过DTD约束,XML就能在DTD的约束下进行自定义了,不过DTD有个缺点,那就是不能对数据进行数值约束这种范围约束。

二、DTD的分类

2.1、内部DTD

  DTD代码与XML代码在同一个文件中

  例如:带有DTD的XML文档实例

"1.0"?>
DOCTYPE note [
from,heading,body)>

from (#PCDATA)>


]
>

Tove
<from>Janifrom>
Reminder
Don't forget me this weekend
View Code

  分析:    

    !DOCTYPE note (第二行)定义此文档是 note 类型的文档。
    !ELEMENT note (第三行)定义 note 元素有四个元素:"to、from、heading,、body"
    !ELEMENT to (第四行)定义 to 元素为 "#PCDATA" 类型
    !ELEMENT from (第五行)定义 frome 元素为 "#PCDATA" 类型
    !ELEMENT heading (第六行)定义 heading 元素为 "#PCDATA" 类型
    !ELEMENT body (第七行)定义 body 元素为 "#PCDATA" 类型

2.2、外部DTD

  DTD约束与xml文档不在同一个文件中,XML文档需引入外部DTD文件

  例如:外部DTD实例,需要将DTD文件引入到XML文件中

"1.0"?>
"note.dtd">

Tove
<from>Janifrom>
Reminder
Don't forget me this weekend!
View Code

  note.dtd文件的内容

from,heading,body)>

from (#PCDATA)>

View Code

2.3、混合DTD

  既有外部DTD,又有内部DTD  

三、DTD在元素中的声明

3.1、元素约束

  格式: 同一元素不允许出现两次声明

  1)内容模式:可以对元素内容进行约束也可以对元素中的子元素进行约束,大小写敏感,内容模式的括号有意义

    1.1)(#PCDATA) :元素内容为任何字符或者空,但不允许有子元素, 不可省略()

    1.2)EMPTY :元素内容为空,不允许有任何文本数据(包括空格换行)与子元素,可以有属性,不可加()
    1.3)ANY :元素可以包含任何数据,包括文本数据和子元素,不可加()

    








View Code

    1.4)(childElements) 由内容模式部件指定:“, | ? + *”

      对内部子元素进行约束,均不能添加其他子元素以及文本(可以空格换行)

      “,”:表示指定子元素必须顺序出现,不多不少
        例如:
        解读:
      “|”:表示在指定的多个子元素中选择出现1个,只能1次
        例如:
        解读:
      “ ”:元素必须且只能出现一次
        例如:
        解读:
      “?”:指定元素要出现0次或1次
        例如:
        解读:
      “+”:指定元素要出现1次或多次
        例如:
        解读:
      “*”:指定元素要出现0次或多次
        例如:
        解读:

  2)混合模式(Mixed)

    元素中既可有文本数据又可有子元素

    
    表示元素中即可以有字符又可以有指定元素,字符数据与指定元素可以出现任意次数,顺序不限。
  注意:优先写#PCDATA,如(#PCDATA|a)*正确,(a|#PCDATA)*错误。
       浏览器是非验证解析器,不会校验xml文档的有效性。

3.2、属性约束

   1)语法:

  ATTLIST 元素名 属性名 属性类型 属性默认值
   属性名 属性类型 属性默认值
   ......
  >

   2)属性类型

    ID 属性值唯一,且属性值必须符合命名规则——不能以数字开头
    (v1|v2|v3)枚举,属性值从中选择一个
    CDATA属性值为字符

  3)属性默认值

    #REQUIRED 属性必须出现,属性值没有限制
    #IMPLIED属性值可以出现可以不出现
    attribute_vlaue属性类型后跟属性值,表示属性如果不出现,则属性值为默认的attribute_value
    #FIXED value #FIXED value表示属性可出现可不出现,显示出现则属性值必须为指定的value,不出现,则值默认value

  注:ID属性类型只能使用#REQUIRED或#IMPLIED;枚举类型后跟默认值必须为匹配值之一      

四、DTD文档的实例

4.1、内嵌

DOCTYPE  根元素[
"实体内容">

属性特点
属性名 属性类型 属性默认值/属性特点
...
>
]
>
View Code

 

4.2、外部引用

"dtd文件路径">
"dtd文件的描述信息" "dtd的url">
View Code

 

4.3、内嵌与外部引用同时使用

"dtd文件路径" [
"实体内容">

ATTLIST 元素名 属性名 属性类型 属性默认值
属性名 属性类型 属性默认值
...
>
]
>
View Code

一个实例:班级约束

  XMLClass.dtd

"男|女">  

ATTLIST 班级
班次 CDATA "1班"
编号 ID #REQUIRED
>


ATTLIST 学生
地址 CDATA #IMPLIED
授课方式 CDATA #FIXED "面授"
学号 ID #REQUIRED
班级编号 IDREF #REQUIRED
朋友 IDREFS #IMPLIED
性别 (
%sex;) #REQUIRED
>


XMLClass.dtd

  XMLtest.xml

"1.0" encoding="UTF-8"?>  

"XMLClass.dtd"
[
"Switch">]>
<班级 编号="C1" 班次="1班">
<学生 地址="湖南" 授课方式="面授" 学号="n1" 班级编号="C1" 朋友="n2" 性别="">
<名字>张三
<年龄>20
<介绍>不错

<学生 授课方式="面授" 学号="n2" 班级编号="C1" 朋友="n1 n3" 性别="">
<名字>李四
<年龄>18
<介绍>很好

<学生 授课方式="面授" 学号="n3" 班级编号="C1" 朋友="n2" 性别="">
<名字>王五
<年龄>22
<介绍>非常好

<作者>&writer;
View Code

   

觉得不错的点个推荐“”哦!

 


推荐阅读
  • 本文介绍了使用kotlin实现动画效果的方法,包括上下移动、放大缩小、旋转等功能。通过代码示例演示了如何使用ObjectAnimator和AnimatorSet来实现动画效果,并提供了实现抖动效果的代码。同时还介绍了如何使用translationY和translationX来实现上下和左右移动的效果。最后还提供了一个anim_small.xml文件的代码示例,可以用来实现放大缩小的效果。 ... [详细]
  • iOS超签签名服务器搭建及其优劣势
    本文介绍了搭建iOS超签签名服务器的原因和优势,包括不掉签、用户可以直接安装不需要信任、体验好等。同时也提到了超签的劣势,即一个证书只能安装100个,成本较高。文章还详细介绍了超签的实现原理,包括用户请求服务器安装mobileconfig文件、服务器调用苹果接口添加udid等步骤。最后,还提到了生成mobileconfig文件和导出AppleWorldwideDeveloperRelationsCertificationAuthority证书的方法。 ... [详细]
  • Spring源码解密之默认标签的解析方式分析
    本文分析了Spring源码解密中默认标签的解析方式。通过对命名空间的判断,区分默认命名空间和自定义命名空间,并采用不同的解析方式。其中,bean标签的解析最为复杂和重要。 ... [详细]
  • eclipse学习(第三章:ssh中的Hibernate)——11.Hibernate的缓存(2级缓存,get和load)
    本文介绍了eclipse学习中的第三章内容,主要讲解了ssh中的Hibernate的缓存,包括2级缓存和get方法、load方法的区别。文章还涉及了项目实践和相关知识点的讲解。 ... [详细]
  • XML介绍与使用的概述及标签规则
    本文介绍了XML的基本概念和用途,包括XML的可扩展性和标签的自定义特性。同时还详细解释了XML标签的规则,包括标签的尖括号和合法标识符的组成,标签必须成对出现的原则以及特殊标签的使用方法。通过本文的阅读,读者可以对XML的基本知识有一个全面的了解。 ... [详细]
  • Android系统移植与调试之如何修改Android设备状态条上音量加减键在横竖屏切换的时候的显示于隐藏
    本文介绍了如何修改Android设备状态条上音量加减键在横竖屏切换时的显示与隐藏。通过修改系统文件system_bar.xml实现了该功能,并分享了解决思路和经验。 ... [详细]
  • 在Xamarin XAML语言中如何在页面级别构建ControlTemplate控件模板
    本文介绍了在Xamarin XAML语言中如何在页面级别构建ControlTemplate控件模板的方法和步骤,包括将ResourceDictionary添加到页面中以及在ResourceDictionary中实现模板的构建。通过本文的阅读,读者可以了解到在Xamarin XAML语言中构建控件模板的具体操作步骤和语法形式。 ... [详细]
  • MyBatis多表查询与动态SQL使用
    本文介绍了MyBatis多表查询与动态SQL的使用方法,包括一对一查询和一对多查询。同时还介绍了动态SQL的使用,包括if标签、trim标签、where标签、set标签和foreach标签的用法。文章还提供了相关的配置信息和示例代码。 ... [详细]
  • web.py开发web 第八章 Formalchemy 服务端验证方法
    本文介绍了在web.py开发中使用Formalchemy进行服务端表单数据验证的方法。以User表单为例,详细说明了对各字段的验证要求,包括必填、长度限制、唯一性等。同时介绍了如何自定义验证方法来实现验证唯一性和两个密码是否相等的功能。该文提供了相关代码示例。 ... [详细]
  • 本文讨论了如何使用Web.Config进行自定义配置节的配置转换。作者提到,他将msbuild设置为详细模式,但转换却忽略了带有替换转换的自定义部分的存在。 ... [详细]
  • Activiti7流程定义开发笔记
    本文介绍了Activiti7流程定义的开发笔记,包括流程定义的概念、使用activiti-explorer和activiti-eclipse-designer进行建模的方式,以及生成流程图的方法。还介绍了流程定义部署的概念和步骤,包括将bpmn和png文件添加部署到activiti数据库中的方法,以及使用ZIP包进行部署的方式。同时还提到了activiti.cfg.xml文件的作用。 ... [详细]
  • baresip android编译、运行教程1语音通话
    本文介绍了如何在安卓平台上编译和运行baresip android,包括下载相关的sdk和ndk,修改ndk路径和输出目录,以及创建一个c++的安卓工程并将目录考到cpp下。详细步骤可参考给出的链接和文档。 ... [详细]
  • 本文介绍了使用PHP实现断点续传乱序合并文件的方法和源码。由于网络原因,文件需要分割成多个部分发送,因此无法按顺序接收。文章中提供了merge2.php的源码,通过使用shuffle函数打乱文件读取顺序,实现了乱序合并文件的功能。同时,还介绍了filesize、glob、unlink、fopen等相关函数的使用。阅读本文可以了解如何使用PHP实现断点续传乱序合并文件的具体步骤。 ... [详细]
  • 本文介绍了Android 7的学习笔记总结,包括最新的移动架构视频、大厂安卓面试真题和项目实战源码讲义。同时还分享了开源的完整内容,并提醒读者在使用FileProvider适配时要注意不同模块的AndroidManfiest.xml中配置的xml文件名必须不同,否则会出现问题。 ... [详细]
  • 基于Socket的多个客户端之间的聊天功能实现方法
    本文介绍了基于Socket的多个客户端之间实现聊天功能的方法,包括服务器端的实现和客户端的实现。服务器端通过每个用户的输出流向特定用户发送消息,而客户端通过输入流接收消息。同时,还介绍了相关的实体类和Socket的基本概念。 ... [详细]
author-avatar
埃菲尔的天空有什么
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有