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

相关文章

深度解析Spring Security 中的 SecurityFilterChain核心功能

《深度解析SpringSecurity中的SecurityFilterChain核心功能》SecurityFilterChain通过组件化配置、类型安全路径匹配、多链协同三大特性,重构了Spri... 目录Spring Security 中的SecurityFilterChain深度解析一、Security

全面解析Golang 中的 Gorilla CORS 中间件正确用法

《全面解析Golang中的GorillaCORS中间件正确用法》Golang中使用gorilla/mux路由器配合rs/cors中间件库可以优雅地解决这个问题,然而,很多人刚开始使用时会遇到配... 目录如何让 golang 中的 Gorilla CORS 中间件正确工作一、基础依赖二、错误用法(很多人一开

Mysql中设计数据表的过程解析

《Mysql中设计数据表的过程解析》数据库约束通过NOTNULL、UNIQUE、DEFAULT、主键和外键等规则保障数据完整性,自动校验数据,减少人工错误,提升数据一致性和业务逻辑严谨性,本文介绍My... 目录1.引言2.NOT NULL——制定某列不可以存储NULL值2.UNIQUE——保证某一列的每一

深度解析Nginx日志分析与499状态码问题解决

《深度解析Nginx日志分析与499状态码问题解决》在Web服务器运维和性能优化过程中,Nginx日志是排查问题的重要依据,本文将围绕Nginx日志分析、499状态码的成因、排查方法及解决方案展开讨论... 目录前言1. Nginx日志基础1.1 Nginx日志存放位置1.2 Nginx日志格式2. 499

MySQL CTE (Common Table Expressions)示例全解析

《MySQLCTE(CommonTableExpressions)示例全解析》MySQL8.0引入CTE,支持递归查询,可创建临时命名结果集,提升复杂查询的可读性与维护性,适用于层次结构数据处... 目录基本语法CTE 主要特点非递归 CTE简单 CTE 示例多 CTE 示例递归 CTE基本递归 CTE 结

Spring Boot 3.x 中 WebClient 示例详解析

《SpringBoot3.x中WebClient示例详解析》SpringBoot3.x中WebClient是响应式HTTP客户端,替代RestTemplate,支持异步非阻塞请求,涵盖GET... 目录Spring Boot 3.x 中 WebClient 全面详解及示例1. WebClient 简介2.

在MySQL中实现冷热数据分离的方法及使用场景底层原理解析

《在MySQL中实现冷热数据分离的方法及使用场景底层原理解析》MySQL冷热数据分离通过分表/分区策略、数据归档和索引优化,将频繁访问的热数据与冷数据分开存储,提升查询效率并降低存储成本,适用于高并发... 目录实现冷热数据分离1. 分表策略2. 使用分区表3. 数据归档与迁移在mysql中实现冷热数据分

C#解析JSON数据全攻略指南

《C#解析JSON数据全攻略指南》这篇文章主要为大家详细介绍了使用C#解析JSON数据全攻略指南,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 目录一、为什么jsON是C#开发必修课?二、四步搞定网络JSON数据1. 获取数据 - HttpClient最佳实践2. 动态解析 - 快速

Spring Boot3.0新特性全面解析与应用实战

《SpringBoot3.0新特性全面解析与应用实战》SpringBoot3.0作为Spring生态系统的一个重要里程碑,带来了众多令人兴奋的新特性和改进,本文将深入解析SpringBoot3.0的... 目录核心变化概览Java版本要求提升迁移至Jakarta EE重要新特性详解1. Native Ima

spring中的@MapperScan注解属性解析

《spring中的@MapperScan注解属性解析》@MapperScan是Spring集成MyBatis时自动扫描Mapper接口的注解,简化配置并支持多数据源,通过属性控制扫描路径和过滤条件,利... 目录一、核心功能与作用二、注解属性解析三、底层实现原理四、使用场景与最佳实践五、注意事项与常见问题六