专栏首页LanceToBigDataXML(二)之DTD——XML文件约束

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

前面介绍了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

  当引用的文件在本地时:<!DOCTYPE 根元素 SYSTEM "DTD文件路径">

  当引用文件是一个公共文件(DTD文件存在于远程服务器上)时:<!DOCTYPE 根元素 PUBLIC "DTD名称" "DTD文件的URL">

1.4、DTD约束原理

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

二、DTD的分类

2.1、内部DTD

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

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

<?xml version="1.0"?>
<!DOCTYPE note [
    <!ELEMENT note (to,from,heading,body)>
    <!ELEMENT to (#PCDATA)>
    <!ELEMENT from (#PCDATA)>
    <!ELEMENT heading (#PCDATA)>
    <!ELEMENT body (#PCDATA)>
]>
<note>
     <to>Tove</to>
     <from>Jani</from>
     <heading>Reminder</heading>
     <body>Don't forget me this weekend</body>
</note>

  分析:    

    !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文件中

<?xml version="1.0"?>
<!DOCTYPE note SYSTEM "note.dtd">
    <note>
        <to>Tove</to>
        <from>Jani</from>
        <heading>Reminder</heading>
        <body>Don't forget me this weekend!</body>
    </note>

  note.dtd文件的内容

<!ELEMENT note (to,from,heading,body)>
<!ELEMENT to (#PCDATA)>
<!ELEMENT from (#PCDATA)>
<!ELEMENT heading (#PCDATA)>
<!ELEMENT body (#PCDATA)>

2.3、混合DTD

  既有外部DTD,又有内部DTD  

三、DTD在元素中的声明

3.1、元素约束

  格式:<!ELEMENT 元素名 (内容模式)> 同一元素不允许出现两次声明

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

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

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

    <!--1.EMPTY:指的是该标签中不能有其他任何的子标签-->
    <!-- <!ELEMENT students EMPTY> -->
        
    <!-- 2.(#PCDATA:表示在该标签中只能出现字符内容,不能出现任何的标签) -->
    <!-- <!ELEMENT students (#PCDATA)> -->
    
    <!--3.ANY:表示在该标签中可以出现任何数据  -->
    <!-- <!ELEMENT students ANY> -->
<students>
</students>

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

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

“,”:表示指定子元素必须顺序出现,不多不少         例如:<!ELEMENT EleName (a,b,c)>         解读:<!-- 表示a、b、c三个元素按照顺序并且每个只能出现一次 -->  “|”:表示在指定的多个子元素中选择出现1个,只能1次         例如:<!ELEMENT EleName (a|b|c)>         解读:<!-- 表示a、b、c三个元素任选其一只能出现一次 --> “ ”:元素必须且只能出现一次         例如:<!ELEMENT EleName (a)>         解读:<!-- 表示a必须出现并且只能出现一次 -->   “?”:指定元素要出现0次或1次         例如:<!ELEMENT EleName (a)?>         解读:<!-- 表示a能够出现0次或1次 -->    “+”:指定元素要出现1次或多次         例如:<!ELEMENT EleName (a)+>         解读:<!-- 表示a能够出现1次或多次 -->  “*”:指定元素要出现0次或多次         例如:<!ELEMENT EleName (a)*>         解读:<!-- 表示a能够出现0次或多次 -->

  2)混合模式(Mixed)

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

    <!ELEMENT EleName (#PCDATA|a|b)*>     表示元素中即可以有字符又可以有指定元素,字符数据与指定元素可以出现任意次数,顺序不限。   注意:优先写#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  根元素[
    <!ENTITY 实体名 "实体内容">
    <!ELEMENT 元素名 (内部模式)>   
     <!ATTLIST 元素名 属性名 属性类型 属性默认值/属性特点
        属性名 属性类型 属性默认值/属性特点
        ...
    >
]>

4.2、外部引用

<!DOCTYPE 根元素 SYSTEM "dtd文件路径">
<!DOCTYPE 根元素 PUBLIC "dtd文件的描述信息" "dtd的url">

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

<!DOCTYPE 根元素 SYSTEM "dtd文件路径" [
    <!ENTITY 实体名 "实体内容">
    <!ELEMENT 元素名 (内部模式)>
    <!ATTLIST 元素名 属性名 属性类型 属性默认值
        属性名 属性类型 属性默认值
        ...
    >
]>

一个实例:班级约束

  XMLClass.dtd

<!ENTITY % sex "男|女">  
<!ELEMENT 班级 (学生+,作者)>  
<!ATTLIST 班级  
    班次 CDATA "1班"  
    编号 ID #REQUIRED  
>  
<!ELEMENT 学生 (名字,年龄,介绍)>  
<!ELEMENT 作者 (#PCDATA)>  
<!ATTLIST 学生  
    地址 CDATA #IMPLIED  
    授课方式 CDATA #FIXED "面授"  
    学号 ID #REQUIRED  
    班级编号 IDREF #REQUIRED  
    朋友 IDREFS #IMPLIED  
    性别 (%sex;) #REQUIRED  
>  
<!ELEMENT 名字 (#PCDATA)>  
<!ELEMENT 年龄 (#PCDATA)>  
<!ELEMENT 介绍 (#PCDATA)> 

  XMLtest.xml

<?xml version="1.0" encoding="UTF-8"?>  
<!-- 引入DTD -->  
<!DOCTYPE 班级 SYSTEM "XMLClass.dtd"  
[<!ENTITY writer "Switch">]>  
<班级 编号="C1" 班次="1班">  
    <学生  地址="湖南" 授课方式="面授" 学号="n1" 班级编号="C1" 朋友="n2" 性别="男">  
        <名字>张三</名字>  
        <年龄>20</年龄>  
        <介绍>不错</介绍>  
    </学生>  
    <学生 授课方式="面授" 学号="n2" 班级编号="C1" 朋友="n1 n3" 性别="女">  
        <名字>李四</名字>  
        <年龄>18</年龄>  
        <介绍>很好</介绍>  
    </学生>  
    <学生 授课方式="面授" 学号="n3" 班级编号="C1" 朋友="n2" 性别="男">  
        <名字>王五</名字>  
        <年龄>22</年龄>  
        <介绍>非常好</介绍>  
    </学生>  
    <作者>&writer;</作者>  
</班级>

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

本文参与 腾讯云自媒体分享计划 ,欢迎热爱写作的你一起参与!
本文分享自作者个人站点/博客:http://www.cnblogs.com/zhangyinhua/复制
如有侵权,请联系 cloudcommunity@tencent.com 删除。
登录 后参与评论
0 条评论

相关文章

  • XML文件约束与DTD的简单介绍

    我们编写文档来约束一个XML文档的书写规范,这称之为XML约束。

    MonroeCode
  • 16.XML语法、CDATA、约束(DTD、Schema)讲解

    xml主要用来描述数据,比如配置文件,网络之间传输数据等,并且在android中也经常用xml来布局,,接下来便来学习xml常用的东西

    张诺谦
  • XML概念定义以及如何定义xml文件编写约束条件java解析xml DTD XML Schema JAXP java xml解析 dom4j 解析 xpath dom sax

    本文主要涉及:xml概念描述,xml的约束文件,dtd,xsd文件的定义使用,如何在xml中引用xsd文件,如何使用java解析xml,解析xml方式dom s...

    noteless
  • Spring 源码第三弹!EntityResolver 是个什么鬼?

    松哥原创的 Spring Boot 视频教程已经杀青,感兴趣的小伙伴戳这里-->Spring Boot+Vue+微人事视频教程

    江南一点雨
  • XML介绍

    1、什么是 XML文件?   XML即可扩展标记语言(eXtensible Markup Language)。标记是指计算机所能理解的信息符号,通过此种标记,计...

    IT可乐
  • [Java拾遗一] XML的书写规范与解析.

    一枝花算不算浪漫
  • XML约束

    由于XML的标签是完全自定义的可以去写任何标签,标签内也可以写任何内容,为了去规范去定义只能有哪些标签,标签的内容只能有哪些类型只能是什么。这个时候就需要写约束...

    木瓜煲鸡脚
  • JavaWeb学习——4.XML

    要写xml,第一步必须要有一个文档声明(写了文档声明之后,表示写xml文件的内容)

    一墨编程学习
  • XXE的原理利用方式及修复

    XXE定义: XXE,"xml external entity injection",即"xml外部实体注入漏洞" 攻击者通过向服务器注入指定的xml实体内容...

    黑白天安全
  • XML 学完这一篇就搞定!

    可扩展:可以自定义标签,甚至可以用中文写标签 Eg:<person></person <张三><张三>

    BWH_Steven
  • 数据库技术:XML

    XML -- Extensible Markup Language,即可扩展标记语言。

    RendaZhang
  • 【愚公系列】2022年01月 Java教学课程 75-xml文件的介绍和解析

    <?xml version="1.0" encoding="UTF-8" standalone="yes”?>

    愚公搬代码
  • XML 出来接客了!

       XML 是可扩展标记语言,标准通用标记语言的子集。XML 的简单易于在任何应用程序中读/写数据,这使 XML 很快成为数据交换的唯一公共语言,虽然不同的应...

    Demo_Null
  • day07_01_XML学习笔记

    黑泽君
  • JavaWeb08-XML,tomcat,HTTP轻松入门

    XML&tomcat&HTTP 一.XML基础知识 1. xml介绍 XML 指可扩展标记语言(EXtensible Markup Language),也是一种...

    Java帮帮
  • java学习与应用(4.3.1)--XML与解析

    XML(extensible markup language可扩展标记语言),由万维网联盟(W3C)提出,以替代HTML,后来基本用语存储数据(配置文件,网络中...

    嘘、小点声
  • JS操作XML中DTD介绍及使用方法分析

    本文实例讲述了JS操作XML中DTD介绍及使用方法。分享给大家供大家参考,具体如下:

    砸漏

扫码关注云+社区

领取腾讯云代金券