xml的2种约束 ( DTD 和 Schema )

目录
    1、xml的约束
    2、dtd的快速入门
    3、dtd的三种引入方式
    4、使用dtd定义元素
    5、使用dtd定义属性
    6、实体的定义
    7、schema约束(了解)
    8、schema的快速入门
=====================================================================
1、xml的约束
    * 为什么需要约束?
    ** 比如现在定义一个person的xml文件,只想要这个文件里面保存人的信息,比如name age等,但是如果在xml文件中
    写了一个标签<猫>,发现可以正常显示,因为符合语法规范。但是猫肯定不是人的信息,xml的标签是自定义的,需要技术来
        规定xml中只能出现的元素,这个时候需要约束。
    * xml的约束的技术 : dtd约束 和 schema约束 (看懂)
2、dtd的快速入门
    * 创建一个文件 后缀名 .dtd
    步骤:
    (1)看xml中有多少个元素 ,有几个元素,在dtd文件中写几个 <!ELEMENT>
    (2)判断元素是简单元素还是复杂元素
        - 复杂元素:有子元素的元素
            <!ELEMENT 元素名称 (子元素)>
        - 简单元素:没有子元素
            <!ELEMENT 元素名称 (#PCDATA)>
            #PCDATA表示值为字符串文本。
    (3)需要在xml文件中引入dtd文件
        <!DOCTYPE 根元素名称 SYSTEM "dtd文件的路径">
    ** 打开xml文件使用浏览器打开的,浏览器只负责校验xml的语法,不负责校验约束
    ** 如果想要校验xml的约束,需要使用工具(myeclipse工具)
    ** 打开myeclipse开发工具
        *** 创建一个项目 day05
        *** 在day05的src目录下面创建一个xml文件和一个dtd文件
        *** 当xml中引入dtd文件之后,比如只能出现name age,多写了一个a,会提示出错
3、dtd的三种引入方式
    (1)引入外部的dtd文件
        <!DOCTYPE 根元素名称 SYSTEM "dtd路径">
    (2)使用内部的dtd文件
        <!DOCTYPE 根元素名称 [
            <!ELEMENT person (name,age)>
            <!ELEMENT name (#PCDATA)>
            <!ELEMENT age (#PCDATA)>
        ]>
    (3)使用外部的dtd文件(网络上的dtd文件)
        <!DOCTYPE 根元素 PUBLIC "DTD名称" "DTD文档的URL">
        - 后面学到框架 struts 使用配置文件 使用 外部的dtd文件
        - <!DOCTYPE struts PUBLIC   "-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"
            "http://struts.apache.org/dtds/struts-2.0.dtd">
4、使用dtd定义元素
    * 语法: <!ELEMENT 元素名 约束>
    * 简单元素:没有子元素的元素
        <!ELEMENT name (#PCDATA)>
        *** (#PCDATA): 约束name是字符串类型
        *** EMPTY : 元素为空(没有内容)
                - <sex></sex>
        *** ANY:任意
    * 复杂元素:
        <!ELEMENT person (name,age,sex,school)>
            子元素只能顺序出现一次.
        <!ELEMENT 元素名称 (子元素+)>
            子元素出现的多次.
              * :表示大于等于0次
              + : 表示大于等于1次
              ? :表示零次或者一次
    * 子元素直接使用 "," 进行隔开 ,表示元素出现的顺序
    * 子元素直接使用 "|" 隔开, 表示元素只能出现其中的任意一个
5、使用dtd定义属性
    * 语法: <!ATTLIST 元素名称
                属性名称 属性类型 属性的约束
            >
    * 属性类型
        ID: 值只能是字母或者下划线开头
            <!ATTLIST 元素名称
                属性名称 ID  #REQUIRED
            >
        CDATA: 字符串
            <!ATTLIST 元素名称
                属性名称 CDATA  #REQUIRED
            >
            如:<birthday ID1="11"></birthday>
        枚举:表示只能在一定的范围内出现值,但是只能每次出现其中的一个
            例如:红绿灯效果
            ** (aa|bb|cc)
            <!ATTLIST 元素名称
                属性名称 (AA|BB|CC)  #REQUIRED
            >
    * 属性的约束
        #REQUIRED :属性必须存在.
        #IMPLIED :属性可有可无.
        #FIXED : 固定值. 属性的值必须是设置的这个固定值.
            例:<!ATTLIST 元素名称
                   属性名称  CDATA  #FIXED  "ABC"
                >
        默认值 : 不写属性,使用直接值, 写了属性,使用设置那个值.
            例:<!ATTLIST 元素名称
                   属性名称  CDATA  "WWW"
                >
6、实体的定义
    * 语法: <!ENTITY 实体名称 "实体的值">
        *** <!ENTITY TEST "HAHAHEHE">
        *** 使用实体 &实体名称;  比如 &TEST;
    ** 注意:定义实体需要写在内部dtd里面,如果写在外部的dtd里面,有某些浏览器下,内容得不到
        例:<!DOCTYPE person [
                <!ELEMENT person (name+)>
                <!ELEMENT name (#PCDATA)>
                <!ATTLIST name
                    sxname ID #REQUIRED
                >
                <!ENTITY TEST "HAHAHEHE">
            ]>
            <person>
                <name sxname="A1">&TEST;</name>
            </person>
======================================================================
7、schema约束
dtd语法: <!ELEMENT 元素名称 约束>
** schema符合xml的语法,xml语句
** 一个xml中可以有多个schema,多个schema使用名称空间区分(类似于java包名)
** dtd里面有PCDATA类型,但是在schema里面可以支持更多的数据类型
*** 比如 年龄 只能是整数,在schema可以直接定义一个整数类型
*** schema语法更加复杂,schema目前不能替代dtd

8、schema的快速入门
    * 创建一个schema文件 后缀名是 .xsd
    ** 根节点: <schema></schema>
    ** 在schema文件里面
    ** 属性:
        xmlns="http://www.w3.org/2001/XMLSchema", 表示当前xml文件是一个约束文件
        targetNamespace="http://www.itcast.cn/20151111", 使用schema约束文件,直接通过这个地址引入约束文件
        elementFormDefault="qualified" 表示规范良好。
    步骤:
    (1)看xml中有多少个元素
        <element>
    (2)看简单元素和复杂元素
        * 如果复杂元素
            <complexType>
                <sequence>
                    子元素
                </sequence>
            </complexType>
        * 简单元素,写在复杂元素的内部
            <element name="person">
                <complexType>
                    <sequence>
                        <element name="name" type="string"></element>
                        <element name="age" type="int"></element>
                    </sequence>
                </complexType>
            </element>
            
    (3)在被约束文件里面引入约束文件
        <person xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
                xmlns="http://www.itcast.cn/20151111"
                xsi:schemaLocation="http://www.itcast.cn/20151111 1.xsd">
        ** xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance": 表示xml是一个被约束文件.
        ** xmlns="http://www.itcast.cn/20151111": 是约束文档里面 targetNamespace.
        ** xsi:schemaLocation="http://www.itcast.cn/20151111 1.xsd">: targetNamespace 空格 约束文档的地址路径

        <sequence>:表示元素的出现的顺序
        <all>: 元素只能出现一次
        <choice>:元素只能出现其中的一个
        <any></any>:表示任意元素
        属性:maxOccurs="unbounded": 表示元素的出现的次数,unbounded:任意多个

        * 可以约束属性
            * 写在复杂元素里面
            ***写在 </complexType>之前
            <attribute name="id1" type="int" use="required"></attribute>
                - name: 属性名称
                - type:属性类型 int stirng
                - use:属性是否必须出现 required

        * 复杂的schema约束
        <company xmlns = "http://www.example.org/company"
                 xmlns:dept="http://www.example.org/department"
             xmlns:xsi = "http://www.w3.org/2001/XMLSchema-instance"
             xsi:schemaLocation="http://www.example.org/company company.xsd
                                 http://www.example.org/department department.xsd" >
        * 引入多个schema文件,可以给每个起一个别名
        <employee age="30">
            <!-- 部门名称 -->
            <dept:name>100</dept:name>
            * 想要引入部门的约束文件里面的name,使用部门的别名 detp:元素名称
            <!-- 员工名称 -->
            <name>王晓晓</name>
        </employee>
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值