XML文件约束之DTD详解

目录

1. 这些都是什么?为什么要学?目的是什么?

2.标准的XML格式

3.DTD

3.1 内部DTD的定义,需要在顶部加入,语法如下:

3.1.1 元素定义:

3.1.2 属性定义:

3.2 外部定义

4.总结,思维导图



本章来介绍一下,什么是XML,什么是DTD,还有一个跟DTD作用一样的Schema,以及为什么要学习这些东西,学习这两些东西的目的是什么。

1. 这些都是什么?为什么要学?目的是什么?

        XML :   指可扩展标记语言(eXtensible Markup Language), 被设计用来传输和存储数据。是各种应用程序之间进行数据传输的最常用的工具。

        XML提供了一套夸平台,跨网络,跨应用程序的语言的描述方式。使用XML可以方便的实现数据交换,系统配置,内容管理等。但是现在比较很少用XML来进行数据交互了,而是用JSON比较多了,因为JSON传输的体积要比XML小很多,更容易传输。

        这也是我们经常会碰到的一个文件,而且很多开源的工具也是用到XML,所以你必须对其有跟多的了解。

        Schema : Schema是对XML文档结构的定义和描述,其主要的作用是用来约束XML文件,并验证XML文件有效性。DTD的作用是定义XML的合法构建模块,它使用一系列的合法元素来定义文档结构。它们之间的区别有下面几点:

1、Schema本身也是XML文档,DTD定义跟XML没有什么关系,Schema在理解和实际应用有很多的好处。

2、DTD文档的结构是“平铺型”的,如果定义复杂的XML文档,很难把握各元素之间的嵌套关系;Schema文档结构性强,各元素之间的嵌套关系非常直观。

3、DTD只能指定元素含有文本,不能定义元素文本的具体类型,如字符型、整型、日期型、自定义类型等。Schema在这方面比DTD强大。

4、Schema支持元素节点顺序的描述,DTD没有提供无序情况的描述,要定义无序必需穷举排列的所有情况。Schema可以利用xs:all来表示无序的情况。

5、对命名空间的支持。DTD无法利用XML的命名空间,Schema很好满足命名空间。并且,Schema还提供了include和import两种引用命名空间的方法。

        

        DTD : 文档类型定义(Document Type Definition)是一套关于标记符的语法规则。

        这个文件主要的功能是验证XML文件编写的合法性,也就是一个约束,要求你只能按DTD定义的格式写。dtd是一种XML的约束,说白了就是我定义了dtd文件,下面的xml编写必须按照我的约束条件来写。

        本章内容主要介绍一下DTD,原因很简单,就是因为简单。

        

2.标准的XML格式

        1) 有且只有一个根元素

        2) XML标签区分大小写

        3) 正确的使用结束标签

        4) 正确的嵌套标签

        5)  使用合法的标签名

        6) 定义有效的属性

3.DTD

        DTD主要分为内部定义和外部定义:

      3.1 内部DTD的定义,需要在顶部加入,语法如下:

    <!DOCTYPE 根节点[需要定义的元素和元素属性]>

元素名称:是自定义的名称,它用于定义被约束 XML 文档中的元素。

元素内容:是对元素包含内容的声明,包括属性类型和属性描述两部分。

         3.1.1 元素定义:

                常用元素的分类:

语法关键字作用示例
<!ELEMENT 节点名称 EMPTY> EMPTY代表空元素<!ELEMENT br EMPTY>
<!ELEMENT 节点名称 (#PCDATA)>#PCDATA代表文本元素,里面的内容必须是文本<!ELEMENT name (#PCDATA)>
<!ELEMENT 节点名称 (e1,e2)>(e1,e2)代表混合元素,表示这个标签里面还有其他的节点<!ELEMENT person (name,age,contact,br*)>

                常用元素的限制:

与( , ) 非 ( | )  ,可以理解成java中的逻辑运算符 &&和  || ,是并且和或者的意思
元素可以出现次数0或1 :?        0~N : *           1~N : +

         3.1.2 属性定义:

                语法

        <!ATTLIST 节点名称
          属性名称 属性类型 属性描述
        >

        示例:
        <!ATTLIST action
        	path CDATA #REQUIRED
        	type CDATA #REQUIRED
        > 

                常用属性类型:

关键字作用示例
ID表示名称相同的节点的这个属性值都必须唯一,不能重复

<!ATTLIST person
      pid ID #REQUIRED

>

( 值1 | 值2 )表示该属性值必须是值1或者是值2

<!ATTLIST person   

     sex (男|女) '男'

>

CDATA该类型表示该属性值必须为文本类型

<!ATTLIST person
     qq CDATA #IMPLIED

>

IDREF该类型表示该属性指向另外一个同级节点,通过ID值示例:
<!ATTLIST person
      parent IDREF #IMPLIED
>

                 常用属性描述:

关键字作用示例
#REQUIRED 表示该属性必填

<!ATTLIST person
      pid ID #REQUIRED

>

#IMPLIED表示该属性可有可无

<!ATTLIST person
     qq CDATA #IMPLIED

>

'默认值' 

表示如果不写该属性会默认有一个,值为'默认值'

注意:只有属性类型为( 值1 | 值2 )时,才可以使用默认值的方式

<!ATTLIST person   

     sex (男|女) '男'

>

        3.2 外部定义

                外部定义其实就是把DTD定义的代码封装到了一个DTD文件中

                引用代码:

        <!DOCTYPE 根节点 SYSTEM  "dtd的地址">

4.总结,思维导图

  • 2
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
XML 映射文件中,可以使用 DTD(Document Type Definition)来定义 XML 文档的结构。 DTD 是一种 XML 文档类型定义语言,它可以定义 XML 文档中元素的类型、属性和顺序等信息。在 XML 映射文件中使用 DTD 可以确保 XML 文档的结构符合规范,同时也方便解析器对 XML 文档进行验证。 下面是一个简单的 DTD 示例: ```xml <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd"> ``` 在这个示例中,<!DOCTYPE> 指令定义了 DTD 的声明。其中,PUBLIC 表示这个 DTD 是公共的,可以被其他文档引用;"-//mybatis.org//DTD Mapper 3.0//EN" 是 DTD 的标识符,用于唯一标识这个 DTD;"http://mybatis.org/dtd/mybatis-3-mapper.dtd" 是 DTD 文件的 URL,用于指定 DTD 文件的位置。 在使用 DTD 定义 XML 文档结构时,可以在 XML 文档中引用 DTD 文件,也可以直接在 XML 文档中嵌入 DTD 定义。例如: ```xml <!DOCTYPE mapper [ <!ELEMENT mapper (select|insert|update|delete)*> <!ELEMENT select (include? , parameter*, (if|choose|when)*, trim*, foreach*, bind*, sql, selectKey?, include*, comment*)> <!ELEMENT insert (selectKey?, parameter*, (if|choose|when)*, trim*, foreach*, bind*, values, selectKey?, include*, comment*)> <!ELEMENT update (selectKey?, parameter*, (if|choose|when)*, trim*, foreach*, bind*, set*, selectKey?, include*, comment*)> <!ELEMENT delete (selectKey?, parameter*, (if|choose|when)*, trim*, foreach*, bind*, include*, comment*)> <!ELEMENT sql (#PCDATA)> <!ELEMENT include (#PCDATA)> <!ELEMENT bind (#PCDATA)> <!ELEMENT trim ((#PCDATA) | trim)*> <!ELEMENT set (#PCDATA)> <!ELEMENT values (#PCDATA)> <!ELEMENT foreach ((#PCDATA) | trim)*> <!ELEMENT if (#PCDATA)> <!ELEMENT choose ((when | otherwise)+)> <!ELEMENT when (#PCDATA)> <!ELEMENT otherwise (#PCDATA)> <!ELEMENT selectKey (#PCDATA)> <!ELEMENT parameter (#PCDATA)> <!ATTLIST mapper namespace CDATA #IMPLIED> <!ATTLIST select id CDATA #REQUIRED parameterType CDATA #IMPLIED resultMap CDATA #IMPLIED fetchSize CDATA #IMPLIED flushCache (true|false) "false" statementType (STATEMENT | PREPARED | CALLABLE) "PREPARED" resultSetType (FORWARD_ONLY | SCROLL_INSENSITIVE | SCROLL_SENSITIVE) "FORWARD_ONLY" timeout CDATA #IMPLIED useCache (true|false) "true" resultOrdered (true|false) "false"> <!ATTLIST insert id CDATA #REQUIRED parameterType CDATA #IMPLIED flushCache (true|false) "false" statementType (STATEMENT | PREPARED | CALLABLE) "PREPARED" timeout CDATA #IMPLIED useGeneratedKeys (false|true) "false" keyProperty CDATA #IMPLIED keyColumn CDATA #IMPLIED selectKey CDATA #IMPLIED> <!ATTLIST update id CDATA #REQUIRED parameterType CDATA #IMPLIED flushCache (true|false) "false" statementType (STATEMENT | PREPARED | CALLABLE) "PREPARED" timeout CDATA #IMPLIED> <!ATTLIST delete id CDATA #REQUIRED parameterType CDATA #IMPLIED flushCache (true|false) "false" statementType (STATEMENT | PREPARED | CALLABLE) "PREPARED" timeout CDATA #IMPLIED> <!ATTLIST sql id CDATA #IMPLIED> <!ATTLIST include refid CDATA #IMPLIED> <!ATTLIST bind name CDATA #REQUIRED value CDATA #REQUIRED> <!ATTLIST trim prefix CDATA #IMPLIED suffix CDATA #IMPLIED suffixOverrides CDATA #IMPLIED prefixOverrides CDATA #IMPLIED> <!ATTLIST set prepend CDATA #IMPLIED suffix CDATA #IMPLIED suffixOverrides CDATA #IMPLIED prefixOverrides CDATA #IMPLIED> <!ATTLIST values nullValue CDATA #IMPLIED> <!ATTLIST foreach collection CDATA #REQUIRED item CDATA #IMPLIED index CDATA #IMPLIED open CDATA #IMPLIED close CDATA #IMPLIED separator CDATA #IMPLIED> <!ATTLIST if test CDATA #REQUIRED> <!ATTLIST when test CDATA #REQUIRED> <!ATTLIST selectKey keyProperty CDATA #IMPLIED resultType CDATA #IMPLIED order CDATA #IMPLIED> <!ATTLIST parameter property CDATA #IMPLIED javaType CDATA #IMPLIED jdbcType CDATA #IMPLIED mode CDATA #IMPLIED resultMap CDATA #IMPLIED numericScale CDATA #IMPLIED typeHandler CDATA #IMPLIED> ]> ``` 在这个示例中,DST 声明了一个名为 mapper 的元素,它包含 0 个或多个 select、insert、update、delete 元素,且这些元素可以以任意顺序出现。同时,还定义了这些元素的属性和属性值,如 select 元素必须包含 id 属性,而 insert 元素可以包含 useGeneratedKeys 和 selectKey 属性等。 通过 DTD,我们可以定义出符合规范的 XML 文档结构,并对 XML 文档进行验证,从而确保数据的正确性和完整性。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值