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

相关文章

在MyBatis的XML映射文件中<trim>元素所有场景下的完整使用示例代码

《在MyBatis的XML映射文件中<trim>元素所有场景下的完整使用示例代码》在MyBatis的XML映射文件中,trim元素用于动态添加SQL语句的一部分,处理前缀、后缀及多余的逗号或连接符,示... 在MyBATis的XML映射文件中,<trim>元素用于动态地添加SQL语句的一部分,例如SET或W

Python xmltodict实现简化XML数据处理

《Pythonxmltodict实现简化XML数据处理》Python社区为提供了xmltodict库,它专为简化XML与Python数据结构的转换而设计,本文主要来为大家介绍一下如何使用xmltod... 目录一、引言二、XMLtodict介绍设计理念适用场景三、功能参数与属性1、parse函数2、unpa

关于Maven中pom.xml文件配置详解

《关于Maven中pom.xml文件配置详解》pom.xml是Maven项目的核心配置文件,它描述了项目的结构、依赖关系、构建配置等信息,通过合理配置pom.xml,可以提高项目的可维护性和构建效率... 目录1. POM文件的基本结构1.1 项目基本信息2. 项目属性2.1 引用属性3. 项目依赖4. 构

使用Python实现批量访问URL并解析XML响应功能

《使用Python实现批量访问URL并解析XML响应功能》在现代Web开发和数据抓取中,批量访问URL并解析响应内容是一个常见的需求,本文将详细介绍如何使用Python实现批量访问URL并解析XML响... 目录引言1. 背景与需求2. 工具方法实现2.1 单URL访问与解析代码实现代码说明2.2 示例调用

SSID究竟是什么? WiFi网络名称及工作方式解析

《SSID究竟是什么?WiFi网络名称及工作方式解析》SID可以看作是无线网络的名称,类似于有线网络中的网络名称或者路由器的名称,在无线网络中,设备通过SSID来识别和连接到特定的无线网络... 当提到 Wi-Fi 网络时,就避不开「SSID」这个术语。简单来说,SSID 就是 Wi-Fi 网络的名称。比如

SpringCloud配置动态更新原理解析

《SpringCloud配置动态更新原理解析》在微服务架构的浩瀚星海中,服务配置的动态更新如同魔法一般,能够让应用在不重启的情况下,实时响应配置的变更,SpringCloud作为微服务架构中的佼佼者,... 目录一、SpringBoot、Cloud配置的读取二、SpringCloud配置动态刷新三、更新@R

使用Java解析JSON数据并提取特定字段的实现步骤(以提取mailNo为例)

《使用Java解析JSON数据并提取特定字段的实现步骤(以提取mailNo为例)》在现代软件开发中,处理JSON数据是一项非常常见的任务,无论是从API接口获取数据,还是将数据存储为JSON格式,解析... 目录1. 背景介绍1.1 jsON简介1.2 实际案例2. 准备工作2.1 环境搭建2.1.1 添加

在C#中合并和解析相对路径方式

《在C#中合并和解析相对路径方式》Path类提供了几个用于操作文件路径的静态方法,其中包括Combine方法和GetFullPath方法,Combine方法将两个路径合并在一起,但不会解析包含相对元素... 目录C#合并和解析相对路径System.IO.Path类幸运的是总结C#合并和解析相对路径对于 C

Java解析JSON的六种方案

《Java解析JSON的六种方案》这篇文章介绍了6种JSON解析方案,包括Jackson、Gson、FastJSON、JsonPath、、手动解析,分别阐述了它们的功能特点、代码示例、高级功能、优缺点... 目录前言1. 使用 Jackson:业界标配功能特点代码示例高级功能优缺点2. 使用 Gson:轻量

Java如何接收并解析HL7协议数据

《Java如何接收并解析HL7协议数据》文章主要介绍了HL7协议及其在医疗行业中的应用,详细描述了如何配置环境、接收和解析数据,以及与前端进行交互的实现方法,文章还分享了使用7Edit工具进行调试的经... 目录一、前言二、正文1、环境配置2、数据接收:HL7Monitor3、数据解析:HL7Busines