XML解析-DTD约束(二)

2024-02-27 22:18
文章标签 xml 解析 约束 dtd

本文主要是介绍XML解析-DTD约束(二),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

一  XML约束
    在XML技术里,可以编写一个文档来约束一个XML文档的书写规范,这称之为XML约束。   
    需要XML约束的原因
    xml由于是可扩展的标记语言,所以在xml文件中的编写太过于自由,这样在很多种情况下并不合适。   
    常用的约束技术
    XML DTD
        DTD文件的后缀名为 .dtd
        DTD文件有自己独立的语法规范
    XML Schema
        Schema文件的后缀名为 .xsd
        Schema文件符合xml语法规范
二  DTD Document Type Define
    DTD的定义:描述元素、属性和其他杂项在xml文档中的使用规则的说明
    DTD的分类:外部的DTD 内部的DTD 混合的DTD
        1).内部的DTD:DTD和xml文档在同一个文件中
        例如:student1.xml文件:
        <?xml version="1.0" encoding="UTF-8"?><!DOCTYPE students[<!ELEMENT students (stu+)><!ELEMENT stu (id,name,age)><!ELEMENT id   (#PCDATA)><!ELEMENT name (#PCDATA)><!ELEMENT age  (#PCDATA)>]><students><stu><id>1</id><name>tom</name><age>20</age></stu></students>
        2).外部的DTD:DTD和xml文档不在同一个文件中
        例如:xml/student2.xml文件       <?xml version="1.0" encoding="UTF-8"?>
        <!DOCTYPE students SYSTEM "../dtd/student.dtd"><students><stu><id>1</id><name>tom</name><age>20</age></stu></students>
        dtd/student.dtd文件:(注意文件的位置,在调用时../dtd/student.dtd表示退出当前目录,进入dtd目录)
        <!ELEMENT students (stu+)><!ELEMENT stu (id,name,age)><!ELEMENT id   (#PCDATA)><!ELEMENT name (#PCDATA)><!ELEMENT age  (#PCDATA)>
        3).混合的DTD:既有外部DTD,又有内部DTD
        例如: xml/student3.xml文件       
<?xml version="1.0" encoding="UTF-8"?><!DOCTYPE students SYSTEM "../dtd/student.dtd"[<!ELEMENT stu (id,name,age)><!ELEMENT id   (#PCDATA)><!ELEMENT name (#PCDATA)><!ELEMENT age  (#PCDATA)>]><students><stu><id>1</id><name>tom</name><age>20</age></stu></students>
        dtd/student.dtd文件:       
<!ELEMENT students (stu+)>
    外部的DTD
        引用外部dtd的时候又分为俩种:
     SYSTEM表示引用的dtd文件在本地
        例如:
        <!DOCTYPE students SYSTEM "../dtd/student.dtd">
     PUBLIC表示引用的dtd文件是一个公共的文件
        格式:注意里面是可以加回车换行的
        <!DOCTYPE 根元素 PUBLIC "" "">
        例如:
        <!DOCTYPE hibernate-configuration PUBLIC
          "-//Hibernate/Hibernate Configuration DTD 3.0//EN"
          "http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd">       
        在后面的"如何在Eclipse中给xml文件添加标签自动提示功能"的部分再做说明
    DTD的目的:
        验证该xml文档是否是有效的xml文档
        如果一个良构的xml文档满足了DTD的声明就是一个有效的xml文档。
        注意:良构 不一定  有效,但是有效一定良构
    DTD对xml文件中元素的约束:
        格式:<!ELEMENT  元素名 (内容模式)>
        内容模式:
            1).EMPTY:元素不能包含子元素和文本(空元素)
            例如:
            dtd文件:          
 <!ELEMENT students (stu)><!ELEMENT stu EMPTY>xml文件:<students><!--这个stu元素中的内容必须为空--><stu></stu></students>
            2).(#PCDATA):可以包含任何字符数据,但是不能在其中包含任何子元素
            例如:
            dtd文件:           
<!ELEMENT students (stu)><!ELEMENT stu (#PCDATA)>xml文件:<students><stu>tom</stu></students>
            3).ANY:元素内容为任意的,主要是使用在元素内容不确定的情况下
            例如:
            dtd文件:           
<!ELEMENT students (stu)><!ELEMENT stu ANY>xml文件:<students><stu>tom</stu></students>或者<students><stu><name>tom</name></stu></students>            
            4).修饰符:() | + * ? , 默认修饰符
            () 来给元素分用组
            |  在列出的元素中选择一个
                例如:
                dtd文件:
                <!ELEMENT students (stu|student)>
                xml文件:
                <students><!--这里只能出现stu元素或者student元素--><!--俩个元素任选其一,不能同时出现--></students>
            +  该元素最少出现一次,可以出现多次 (1或n次)
                例如:
                dtd文件:
                <!ELEMENT students (stu+)>
                xml文件:
                <students><stu></stu><stu></stu><stu></stu></students>
            *  该元素允许出现零次到任意多次(0到n次)
                例如:
                dtd文件:
                <!ELEMENT students (stu*)>
                xml文件:
                <students><!--stu出现0次到n次--><stu></stu><stu></stu><stu></stu></students>
            ?  该元素可以出现,但只能出现一次 (0到1次)
                例如:
                dtd文件:
                <!ELEMENT students (stu?)>
                xml文件:
                <students><!--stu出现0次到1次--><stu></stu></students>
            ,  对象必须按指定的顺序出现
                例如:
                dtd文件:
                <!ELEMENT students (stu*)><!ELEMENT stu (id,name,age)>
                xml文件:
                <students><stu><id></id><name></name><age></age></stu></students>
            默认修饰符 就是什么修饰符都没有加
                例如:
                dtd文件:
                <!ELEMENT students (stu)>
                xml文件:
                <students><!--这里只能出现stu元素1次--><!--stu元素不出现也验证不通过--><stu></stu></students>       
            5).混合元素 子元素是任意类型 出现任意次数 并且没有出现顺序要求
                例如:
                dtd文件:
                <!ELEMENT students (stu*)><!ELEMENT stu (#PCDATA|id|name|age)*>
                xml文件:
                <students><stu></stu><stu><id></id><name></name><age></age></stu><stu>tom</stu></students>
                注意:
                1 根元素students里面可以出现stu子元素0到n次
                2 stu元素中可以写文本也可以写id、name、age子元素
                3 id、name、age子元素出现的顺序没有要求
                4 id、name、age子元素可以都出现也可以都不出现
        注意:浏览器是非验证的解析器,不会验证xml的有效性,可以使用Eclipse去验证xml的有效性   
    DTD对xml文件中属性的约束:
        格式:<!ATTLIST 元素名称
                    属性名称    值类型    属性特点
                    属性名称    值类型    属性特点
              >
        属性类型:
            1).CDATA:属性值可以是任何字符(包括数字和中文)
                例如:
                dtd文件:
               <!ELEMENT students (stu*)>           <!ELEMENT stu (#PCDATA)><!ATTLIST stuid   CDATA #REQUIREDname CDATA #REQUIRED>
                xml文件:
                <students><stu id="1" name="tom"></stu></students>
            2).ID:属性值必须唯一,属性值必须满足xml命名规则
                例如:
                dtd文件:
                <!ELEMENT students (stu*)><!ELEMENT stu (#PCDATA)><!ATTLIST stuid   ID    #REQUIREDname CDATA #REQUIRED>
                xml文件:
                <students><stu id="A1" name="tom"></stu><stu id="B1" name="tom"></stu></students>
                注意:
                    1. id和name属性必须出现
                    2. id属性的值必须满足xml名字规范,例如不能数字开头
                    3. id属性的值不能重复
                    4. 多个属性的出现是没有顺序要求的
            3).IDREF/IDREFS
                IDREF属性的值指向文档中其它地方声明的ID类型的值。
                IDREFS同IDREF,但是可以具有由空格分开的多个引用。
                例如:
                dtd文件:
                <!ELEMENT students (stu*)><!ELEMENT stu (#PCDATA)><!ATTLIST stuid   ID           #REQUIREDpid  IDREFS       #IMPLIEDname CDATA        #REQUIRED>
                xml文件:
                <students><stu id="A1" name="tom"></stu><stu id="B1" name="tom"></stu><stu id="C1" name="tom" pid="A1 B1"></stu></students>
                注意:
                    1. id和name属性必须出现
                    2. pid属性出现可以,不出现也可以
                    3. id属性的值必须满足xml名字规范,例如不能数字开头
                    4. id属性的值不能重复
                    5. pid属性的值必须是引用其他stu元素的id值
                    6. pid属性的值可以是多个,使用空格隔开
                    7. 多个属性的出现是没有顺序要求的
            4).enumerated:(枚举值1|枚举值2|枚举值3...),属性值必须在枚举值中
                例如:
                dtd文件:
                <!ELEMENT students (stu*)><!ELEMENT stu (#PCDATA)><!ATTLIST stuid     ID            #REQUIREDname   CDATA         #REQUIREDgender (男|女)         #REQUIRED>
                xml文件:
                <students><stu id="A1" name="tom" gender="男"></stu><stu id="B1" name="tom" gender="女"></stu></students>
                注意:
                    1. id/name/gender属性必须出现
                    2. id属性的值必须满足xml名字规范,例如不能数字开头
                    3. id属性的值不能重复
                    4. gender属性的值必须是男或者女
                    5. 多个属性的出现是没有顺序要求的
        属性特点:
            1).#REQUIRED:元素的所有实例都必须有该属性
                例如:
                dtd文件:
                <!ELEMENT students (stu*)><!ELEMENT stu (#PCDATA)><!ATTLIST stuname   CDATA   #REQUIRED>
                xml文件:
                <students><stu name=""></stu><stu name="tom"></stu></students>
                注意:
                    1. name属性必须出现
                    2. name属性的值可以为空也可以不为空
            2).#IMPLIED :属性可以不出现
                例如:
                dtd文件:
                <!ELEMENT students (stu*)><!ELEMENT stu (#PCDATA)><!ATTLIST stuname   CDATA   #IMPLIED>
                xml文件:
                <students><stu name=""></stu><stu name="tom"></stu><stu></stu></students>
                注意:
                    1. name属性可以出现也可以不出现
                    2. name属性的值可以为空也可以不为空
            3).default-value:属性可以不出现,并且当它不出现的时候是有默认值的,而该属性的默认值就是atttibute-value
                例如:
                dtd文件:               
                <!ELEMENT students (stu*)><!ELEMENT stu (#PCDATA)><!ATTLIST stuname   CDATA   "tom">
                xml文件:               
                <students><stu name="zhangsan"></stu><stu></stu></students>
                注意:
                    1. name属性可以出现也可以不出现
                    2. name属性如果出现则默认值为tom
            4).#FIXED :属性可以不出现,但是如果出现的话必须是指定的属性值
                例如:
                dtd文件:              
                <!ELEMENT students (stu*)><!ELEMENT stu (#PCDATA)><!ATTLIST stuname   CDATA   #IMPLIEDschool CDATA   #FIXED "briup">
                xml文件:               
               <students><stu school="briup"></stu><stu></stu></students>
                注意:
                    1. name/school属性可以出现也可以不出现
                    2. school属性如果出现那么值一定要是briup       
    DTD文档的一个实例:
        dtd文档:       
        <!ELEMENT students (student+)><!ELEMENT student (name,age?,score*)><!ATTLIST student id CDATA #REQUIRED><!ELEMENT name (#PCDATA)><!ATTLIST name firstName CDATA #IMPLIED><!ELEMENT age (#PCDATA)><!ATTLIST age xuAge CDATA #FIXED "20"><!ELEMENT score (#PCDATA)><!ATTLIST score sel (60|80|100) #REQUIRED>
      利用DTD文件在Eclipse中给xml文件添加标签自动提示功能       
      利用schame文件在Eclipse中给xml文件添加标签自动提示功能   

这篇关于XML解析-DTD约束(二)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/753740

相关文章

python常见环境管理工具超全解析

《python常见环境管理工具超全解析》在Python开发中,管理多个项目及其依赖项通常是一个挑战,下面:本文主要介绍python常见环境管理工具的相关资料,文中通过代码介绍的非常详细,需要的朋友... 目录1. conda2. pip3. uvuv 工具自动创建和管理环境的特点4. setup.py5.

全面解析HTML5中Checkbox标签

《全面解析HTML5中Checkbox标签》Checkbox是HTML5中非常重要的表单元素之一,通过合理使用其属性和样式自定义方法,可以为用户提供丰富多样的交互体验,这篇文章给大家介绍HTML5中C... 在html5中,Checkbox(复选框)是一种常用的表单元素,允许用户在一组选项中选择多个项目。本

SpringBoot项目配置logback-spring.xml屏蔽特定路径的日志

《SpringBoot项目配置logback-spring.xml屏蔽特定路径的日志》在SpringBoot项目中,使用logback-spring.xml配置屏蔽特定路径的日志有两种常用方式,文中的... 目录方案一:基础配置(直接关闭目标路径日志)方案二:结合 Spring Profile 按环境屏蔽关

Python包管理工具核心指令uvx举例详细解析

《Python包管理工具核心指令uvx举例详细解析》:本文主要介绍Python包管理工具核心指令uvx的相关资料,uvx是uv工具链中用于临时运行Python命令行工具的高效执行器,依托Rust实... 目录一、uvx 的定位与核心功能二、uvx 的典型应用场景三、uvx 与传统工具对比四、uvx 的技术实

SpringBoot排查和解决JSON解析错误(400 Bad Request)的方法

《SpringBoot排查和解决JSON解析错误(400BadRequest)的方法》在开发SpringBootRESTfulAPI时,客户端与服务端的数据交互通常使用JSON格式,然而,JSON... 目录问题背景1. 问题描述2. 错误分析解决方案1. 手动重新输入jsON2. 使用工具清理JSON3.

Redis过期删除机制与内存淘汰策略的解析指南

《Redis过期删除机制与内存淘汰策略的解析指南》在使用Redis构建缓存系统时,很多开发者只设置了EXPIRE但却忽略了背后Redis的过期删除机制与内存淘汰策略,下面小编就来和大家详细介绍一下... 目录1、简述2、Redis http://www.chinasem.cn的过期删除策略(Key Expir

Go学习记录之runtime包深入解析

《Go学习记录之runtime包深入解析》Go语言runtime包管理运行时环境,涵盖goroutine调度、内存分配、垃圾回收、类型信息等核心功能,:本文主要介绍Go学习记录之runtime包的... 目录前言:一、runtime包内容学习1、作用:① Goroutine和并发控制:② 垃圾回收:③ 栈和

Spring组件实例化扩展点之InstantiationAwareBeanPostProcessor使用场景解析

《Spring组件实例化扩展点之InstantiationAwareBeanPostProcessor使用场景解析》InstantiationAwareBeanPostProcessor是Spring... 目录一、什么是InstantiationAwareBeanPostProcessor?二、核心方法解

深入解析 Java Future 类及代码示例

《深入解析JavaFuture类及代码示例》JavaFuture是java.util.concurrent包中用于表示异步计算结果的核心接口,下面给大家介绍JavaFuture类及实例代码,感兴... 目录一、Future 类概述二、核心工作机制代码示例执行流程2. 状态机模型3. 核心方法解析行为总结:三

springboot项目中使用JOSN解析库的方法

《springboot项目中使用JOSN解析库的方法》JSON,全程是JavaScriptObjectNotation,是一种轻量级的数据交换格式,本文给大家介绍springboot项目中使用JOSN... 目录一、jsON解析简介二、Spring Boot项目中使用JSON解析1、pom.XML文件引入依