XML基础--XML的约束之dtd约束

  • 为何XML需要约束?
<?xml version="1.0" encoding="utf-8"?>
<person>
	<name>zhangsan</name>
	<age>20</age>
	<>10</>
</person>

在这段代码中,人的属性有姓名,年龄,猫是人的属性显然是不合理的,由于XML的标签是自定义的,我们要通过相关约束技术来规定XML中只能出现的元素。

  • 如何进行约束?
    约束技术:dtd约束和schema约束。

    dtd约束(快速入门):

    1. 创建一个后缀名为dtd的文件
    2. 观察XML中有几个元素,就在dtd文件中写几个<!ELEMENT>
    3. 判断元素是简单元素还是复杂元素:
      简单元素:没有子元素
      <!ELEMENT 元素名称 (#PCDATA)>
      复杂元素:有子元素
      <!ELEMENT 元素名称 (子元素)>
    4. 需要在XML文件中引入dtd文件
      <!DOCTYPE 根元素 SYSTEM "dtd文件的路径">

book.dtd

<!ELEMENT 书架 (书+)>
	<!ELEMENT  (书名,作者,售价)>
	<!ELEMENT 书名 (#PCDATA)>
	<!ELEMENT 作者 (#PCDATA)>
	<!ELEMENT 售价 (#PCDATA)>

book.xml

<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE 书架 SYSTEM "book.dtd">
<书架>
	<>
		<书名>葵花宝典</书名>
		<作者>东方不败</作者>
		<售价>15.00元</售价>
	</>
	<>
		<书名>九阳神功</书名>
		<作者>张无忌</作者>
		<售价>56.00元</售价>
	</>
</书架>
  • dtd的三种引入方式:
  1. 外部引入:如上
  2. 内部引入:
<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE person [
	<!ELEMENT person (name,age)>
	<!ELEMENT name (#PCDATA)>
	<!ELEMENT age (#PCDATA)>
]>
<person>
	<name>zhangsan</name>
	<age>20</age>
	<!-- <猫>10</猫>-->
</person>


3. 使用外面的dtd(网络上的dtd文件)
<!DOCTYPE 根元素 PUBLIC "DTD名称" “DTD文档的URL”>


  • 使用dtd定义元素:
    1. 语法:<!ELEMENT 元素名 约束>
    2. 简单元素:没有子元素的元素 <!ELEMENT 元素名 (子元素)>

约束
(#PCDATA):字符串
EMPTY:为空
ANY:可为空or不为空

复杂元素:有子元素的元素,子元素用英文逗号按照顺序分隔(用 | 分隔时表示子元素只能出现任意一个)<!ELEMENT 元素名称 (子元素+,/| 子元素1..)>

+:表示至少出现一个相关元素
?:表示出现一次或零次相关元素
*:表示零次或多次出现相关元素


  • 使用dtd定义属性:
    1. 语法:<!ATTLIST 元素名称 属性名称 属性类型 属性的约束>
    2. 属性的类型:
      CDATA:字符串
      枚举:值只能是列举的范围内出现的,且一次只能出现一个(如(aa|bb|cc))
      ID:值只能是字母或下划线开始
    3. 属性的约束:
      #REQUIRED:表示该属性必须出现
      #IMPLIED:表示该属性可有可无
      #FIXED:表示该属性只能是设置的值(写法:#FIXED “123”)
      直接值:不写属性,使用直接值,写了属性,使用写的值
<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE person [
	<!--元素-->
	<!ELEMENT person (name,age)>
	<!ELEMENT name (#PCDATA)>
	<!ELEMENT age (#PCDATA)>
	<!ELEMENT height (#PCDATA)>
	<!ELEMENT weight (#PCDATA)>
	
	<!--属性 -->
	<!ATTLIST name ID1 CDATA #REQUIRED>
	<!--AA必须出现-->
	
	<!ATTLIST age ID2 (AA|BB|CC) #REQUIRED>
	<!--ID2的值只能是AA|BB|CC中的值-->
	
	<!ATTLIST height ID3 ID #IMPLIED>
	<!--ID3可有可无-->
	
	<!ATTLIST weight ID4 #FIXED "DD">
	<!--ID4只能是DD-->
]>
<person>
	<name ID1="AA">zhangsan</name>
	<age ID2="BB">20</age>
	<height ID3="_CC">178</height>
	<weight ID4="DD">77</weight>
</person>

浏览器只负责校验XML的语法,不负责校验,校验XML的约束需要使用工具(如myeclipse)。

>>下一页 Schema约束

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 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、付费专栏及课程。

余额充值