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

相关文章

深度解析Java DTO(最新推荐)

《深度解析JavaDTO(最新推荐)》DTO(DataTransferObject)是一种用于在不同层(如Controller层、Service层)之间传输数据的对象设计模式,其核心目的是封装数据,... 目录一、什么是DTO?DTO的核心特点:二、为什么需要DTO?(对比Entity)三、实际应用场景解析

深度解析Java项目中包和包之间的联系

《深度解析Java项目中包和包之间的联系》文章浏览阅读850次,点赞13次,收藏8次。本文详细介绍了Java分层架构中的几个关键包:DTO、Controller、Service和Mapper。_jav... 目录前言一、各大包1.DTO1.1、DTO的核心用途1.2. DTO与实体类(Entity)的区别1

Java中的雪花算法Snowflake解析与实践技巧

《Java中的雪花算法Snowflake解析与实践技巧》本文解析了雪花算法的原理、Java实现及生产实践,涵盖ID结构、位运算技巧、时钟回拨处理、WorkerId分配等关键点,并探讨了百度UidGen... 目录一、雪花算法核心原理1.1 算法起源1.2 ID结构详解1.3 核心特性二、Java实现解析2.

python删除xml中的w:ascii属性的步骤

《python删除xml中的w:ascii属性的步骤》使用xml.etree.ElementTree删除WordXML中w:ascii属性,需注册命名空间并定位rFonts元素,通过del操作删除属... 可以使用python的XML.etree.ElementTree模块通过以下步骤删除XML中的w:as

使用Python绘制3D堆叠条形图全解析

《使用Python绘制3D堆叠条形图全解析》在数据可视化的工具箱里,3D图表总能带来眼前一亮的效果,本文就来和大家聊聊如何使用Python实现绘制3D堆叠条形图,感兴趣的小伙伴可以了解下... 目录为什么选择 3D 堆叠条形图代码实现:从数据到 3D 世界的搭建核心代码逐行解析细节优化应用场景:3D 堆叠图

深度解析Python装饰器常见用法与进阶技巧

《深度解析Python装饰器常见用法与进阶技巧》Python装饰器(Decorator)是提升代码可读性与复用性的强大工具,本文将深入解析Python装饰器的原理,常见用法,进阶技巧与最佳实践,希望可... 目录装饰器的基本原理函数装饰器的常见用法带参数的装饰器类装饰器与方法装饰器装饰器的嵌套与组合进阶技巧

解析C++11 static_assert及与Boost库的关联从入门到精通

《解析C++11static_assert及与Boost库的关联从入门到精通》static_assert是C++中强大的编译时验证工具,它能够在编译阶段拦截不符合预期的类型或值,增强代码的健壮性,通... 目录一、背景知识:传统断言方法的局限性1.1 assert宏1.2 #error指令1.3 第三方解决

全面解析MySQL索引长度限制问题与解决方案

《全面解析MySQL索引长度限制问题与解决方案》MySQL对索引长度设限是为了保持高效的数据检索性能,这个限制不是MySQL的缺陷,而是数据库设计中的权衡结果,下面我们就来看看如何解决这一问题吧... 目录引言:为什么会有索引键长度问题?一、问题根源深度解析mysql索引长度限制原理实际场景示例二、五大解决

深度解析Spring Boot拦截器Interceptor与过滤器Filter的区别与实战指南

《深度解析SpringBoot拦截器Interceptor与过滤器Filter的区别与实战指南》本文深度解析SpringBoot中拦截器与过滤器的区别,涵盖执行顺序、依赖关系、异常处理等核心差异,并... 目录Spring Boot拦截器(Interceptor)与过滤器(Filter)深度解析:区别、实现

深度解析Spring AOP @Aspect 原理、实战与最佳实践教程

《深度解析SpringAOP@Aspect原理、实战与最佳实践教程》文章系统讲解了SpringAOP核心概念、实现方式及原理,涵盖横切关注点分离、代理机制(JDK/CGLIB)、切入点类型、性能... 目录1. @ASPect 核心概念1.1 AOP 编程范式1.2 @Aspect 关键特性2. 完整代码实