zoukankan      html  css  js  c++  java
  • 2.xml约束技术----------dtd约束

    1.xml的约束

      (1)为什么需要定义约束了

        比如现在定义一个person的xml文件,只想要这个文件里面保存人的信息,比如name age等,但是如果在xml文件中写了一个元素<猫>,发现可以正常显示,因为符合语法规范。但是猫肯定不是人的信息,xml的元素时自定义的,需要技术来规定xml中只能出现的元素,这个时候就需要约束了

        xml的约束的技术:dtd约束 和 schema约束

    2.dtd的编写使用步骤(注意语法的格式,该打空格就打空格)

      (1)创建一个文件,后缀名为.dtd

      (2)在文件中写入约束

        a.看xml中有多少个元素,有几个元素那么就在dtd文件中写几个<!ELEMENT>(大写)

        b.判断元素时简单元素还是复杂元素

          - 复杂元素:由子元素(  语法:<!ELEMENT 元素名字 (子元素1,子元素2...)>  )

          - 简单元素:没有子元素(  语法:<!ELEMENT 元素名字 (#PCDATA)>   )

        c.在xml文件中引入dtd文件

          语法: <!DOCTYPE 根元素名称 SYSTEM "dtd文件的路径">

      (3)注意

        浏览器只负责检验xml的语法,不负责校验约束(责校约束,我们需要以来工具,比如Eclipse MyEclipse)

    实例一:按照dtd约束进行定义xml元素

    dtd约束代码如下:

    <!ELEMENT persion (name,age)>
        <!ELEMENT name (#PCDATA)>
        <!ELEMENT age (#PCDATA)>

    xml文件代码如下(按照dtd约束)

    <?xml version="1.0" encoding="GBK"?>
    <!DOCTYPE persion SYSTEM "Demo1.dtd">
    <persion>
        <name>张三</name>
        <age>123</age>
    </persion>

    浏览器显示

    实例二:不按照dtd约束定义xml元素

    如果我们不按照dtd约束,那么Eclipse会提示错误,但是在浏览器中运行却可以显示

    但浏览器正常显示

    3.dtd的三种引入方式

      (1)使用外部的dtd文件(例如上面的实例就是使用这个方式)

        语法:<!DOCTYPE 根元素名字 SYSTEM "dtd路径">

      (2)在xml里面使用dtd文件

        语法:<!DOCTYPE 根元素名字 [

             <!ELEMENT persion (name,age)>

             <!ELEMENT name (#CPDATA)>

             <!ELEMENT age (#PCDATA)>

           ]>

      例如代码如下:

    <?xml version="1.0" encoding="gbk"?>
    <!DOCTYPE persion [
        <!ELEMENT persion (name,age,profession)><!--这个可写也可不写(最好还是写上)-->
        <!ELEMENT name (#PCDATA)>
        <!ELEMENT age (#PCDATA)>
        <!ELEMENT profession (student)>
        <!ELEMENT student (#PCDATA)>
    ]>
    
    <persion>
        <name>张三</name>
        <age>18</age>
        <profession>
            <student>学生</student>
        </profession>
    </persion>

      (3)使用网络上面的dtd文件(别人已经定义好了的)

        语法:<!DOCTYPE 根元素 PUBLIC "dtd名字" "dtd文档的URL">

        框架struts2就会使用配置文件,并且使用的是网络上面的dtd文件

    4.使用dtd约束定义元素

      (1)语法:<!ELEMENT 元素名 约束>

      (2)简单元素:没有子元素的元素

        <!ELEMENT name (#PCDATA)>

        - (#PCDATA) :表示该元素可以包含字符串数据,但是不能包含子元素

        - EMPTY:表示为空(就是没有内容,例如<a></a>)

        - ANY :表示可以包含任意类型数据

      (2)复杂元素:

        <!ELEMENT persion (name,age)>  表示子元素只能出现一次

        <!ELEMENT persion (name+,age)>  表示name元素可以出现一次或则多次

        符号的意义:

          + :表示一次或者多次(>=1)

          ?:表示零次或者一次(==0或则==1)

          * :表示零次或者多次(>=0)

          ,:如果子元素直接用逗号分割,那么表示子元素出现的顺序

          | :如果子元素用|分割,那么之元素只能出现其中一个

      下面是一个例子:

    <?xml version="1.0" encoding="gbk"?>
    <!DOCTYPE persion [
        <!ELEMENT persion (name+,age?,(profession*|aaa))><!--这个可写也可不写(最好还是写上)-->
        <!ELEMENT name EMPTY>
        <!ELEMENT age ANY>
        <!ELEMENT profession (#PCDATA)>
    ]>
    
    <persion>
        <name></name>
        <name></name>
        <!-- <age>18</age>这个因为是可以定义0次也可以1次,所以注释掉 -->
        <profession>学生1</profession>
        <profession>学生2</profession>
        <profession>学生3</profession>
    </persion>

        

     6.使用dtd定义属性约束(就如html中class,id等一样)

      (1)语法:<!ATTLIST 元素名字

            属性名字 属性类型 属性约束

         >

      (2)属性的值的类型

        a.CDATA:字符串

        例如:<!ATTLIST name

             ID1 CDATA #REQUIRED

            >

        b.枚举:表示只能在一定范围内出现的值,但是每次只能出现其中一个

        例如:<!ATTLIST name

             ID1 (AA|BB|CC) #REQUIRED

           >

        c.ID : 属性的值只能是字符或者下划线开头

        例如:<!ATTLIST name

             ID1 ID #REQUIRED

           >

      (3)属性约束

        #REQUIRED : 属性必须存在

        #IMPLIED : 属性可有可无

        #FIXED : 表示一个固定值 #FIXED "AAA"(也就是属性的值必须是AAA,不能是其他的值)

         默认值:

          例如:<!ATTLIST name

               ID1 CDATA "WWW"

             >

          如果我们在xml页面中给这个属性没有赋值,那么默认就是WWW,如果赋值了,那么就是自己赋的值

      (4)实体

        意义:我们在写xml的时候,元素里面的值可以引用这个实体(也就是先在dtd文件中定义,再到xml文件中使用)

          语法:<!ENTITY TEXT "entity">----<!ENTITY 实体名 "实体值">

        调用:在元素中写   &TEXT;

        注意:定义实体需要写在内部的dtd里面,如果写在外部dtd里面,某些浏览器获取不到之个值

    实例代码如下:

    <?xml version="1.0" encoding="UTF-8"?>
    <!DOCTYPE persion [
        <!--定义元素约束-->
        <!ELEMENT persion (name,age,profession,default,entity)>
        <!ELEMENT name (#PCDATA)>
        <!ELEMENT age (#PCDATA)>
        <!ELEMENT profession (#PCDATA)>
        <!ELEMENT default (#PCDATA)>
        <!ELEMENT entity (#PCDATA)>
        
        <!--元素属性约束-->
        <!--name的值只能是这几个枚举之中的一个,并且必须写-->
        <!ATTLIST name
            ID1 (AA|BB|CC) #REQUIRED 
        >
        <!--表示属性的值只能是字符或者下划线开头,并且这个属性可写可不写-->
        <!ATTLIST age
            ID2 ID #IMPLIED 
        >
        <!--表示这个属性的值只能是WWW-->
        <!ATTLIST profession
            ID3 CDATA #FIXED "WWW"  
        >
        <!--表示这个属性的值默认是default-->
        <!ATTLIST default
            ID4 CDATA "default" 
        >
        
        <!--定义实体-->
        <!ENTITY TEXT "entity">
    ]>
    
    <persion>
        <name ID1="AA"></name>
        <age ID2="_id"></age>
        <profession ID3="WWW"></profession>
        <default></default>
        <entity>&TEXT;</entity>
    </persion>

  • 相关阅读:
    ASP.NET Core 中的依赖注入 [共7篇]
    ASP.NET Core的配置(4):多样性的配置来源[下篇]
    ASP.NET Core的配置(4):多样性的配置来源[中篇]
    ASP.NET Core的配置(4):多样性的配置来源[上篇]
    ASP.NET Core的配置(3): 将配置绑定为对象[下篇]
    ASP.NET Core的配置(3): 将配置绑定为对象[上篇]
    ASP.NET Core的配置(2):配置模型详解
    ASP.NET Core的配置(1):读取配置信息
    ASP.NET Core中的依赖注入(5):ServicePrvider实现揭秘【补充漏掉的细节】
    ASP.NET Core中的依赖注入(5): ServiceProvider实现揭秘 【解读ServiceCallSite 】
  • 原文地址:https://www.cnblogs.com/zjdbk/p/9129927.html
Copyright © 2011-2022 走看看