如何写XML的约束----DTD,Schema

1 篇文章 0 订阅

XML约束

由于xml文件的内容可高度自定义,这时为了使编写xml时按照一定的格式规范(提前定义好的标签)去编写时(比如只能写<age></age>),就需要通过约束来 规范自已的xml文件。
约束文件的作用
规范xml文件的书写规则(限制xml文件只能出现哪些标签元素)

使用场景:
当我们自已写了一个的框架,给到开发者使用的时候。
可以通过在xml配置文件中编写某些特定功能的标签,来动态切换框架的某些特定功能,这时就需要约束来帮我们写这特定功能的标签。
(比如,背景颜色,可以由xml配置文件里面的颜色标签动态控制时,使用框架的开发者,是使用 color标签(<color>颜色</color>) ,还是使用bgcolor标签(<bgcolor>颜色</bgcolor>),这时候就需要开发框架的作者,对这个xml配置文件提前写好预定义的标签(比如提前写好bgcolor标签是用来修改背景颜色的),而约束的知识就是帮你解决怎么在xml配置文件中提前写好预定义的标签,而由约束写出来的约束文件(.dtd .xsd)就是xml配置文件的说明书,里面会说明这个xml文件中,可以定义哪些标签,标签的作用是什么等)。

DTD约束 和 schema约束

DTD

怎么写DTD约束文件。

新增一个文本编辑器,修改其后缀为.dtd 保存即可生成DTD文件。
DTD 文件内容的编写.

DTD的数据类型 只有两个
1. #PCDATA(存放文本数据) 、
2. ID(赋值的时候不能数字开头)

DTD 的两个标签
1.<!ELEMENT>用来声明自定义标签的
2. <!ATTLIST> 给标签定义属性
语法格式
<!ELEMENT 标签名 (标签存放的数据格式)>
<!ATTLIST 标签名 属性名 ID #REQUIRED> 设置一个自定义标签的某个自定义属性名为ID REQUIRED必须填的

<!-- 声明了一个 age标签   数据类型为#PCDATA -->
<!ELEMENT  age  (#PCDATA)>
<!-- 声明了一个 name标签   数据类型为#PCDATA -->
<!ELEMENT name (#PCDATA)>
<!-- 声明了一个 sex标签   数据类型为#PCDATA -->
<!ELEMENT sex (#PCDATA) >

<!--  相当于声明了一个容器标签students,容器里面只能存放(student)类型的标签   +是正则里面的至少出现1次或多次 -->
<!ELEMENT students (student+) >
<!--  声明了一个 student标签  里面存放的数据类型是 name,age,sex标签  -->
<!ELEMENT student (name,age,sex)>

< 给 student 标签  添加 一个 ID 属性 叫stu_id>
<!ATTLIST student stu_id ID #REQUIRED>


怎么导入DTD约束文件

分两种:
1。直接在内部导入(不推荐)
格式 <!DOCTYPE 根标签 [dtd 约束]>

<?xml version="1.0" encoding="UTF-8" ?>
<!-- 内部直接写dtd约束 -->
<!DOCTYPE students [

        <!ELEMENT name (#PCDATA)>
        <!ELEMENT age (#PCDATA)>
        <!ELEMENT sex (#PCDATA)>
        <!ELEMENT student (name,age,sex)>
        <!ELEMENT students (student)>
        <!ATTLIST student stu_id ID #REQUIRED>
        
        ]>

<students>
    <student stu_id="s1">
        <name>xuan</name>
        <age>24</age>
        <sex>male</sex>
    </student>
    
</students>

2.外部导入(推荐)
本地导入

<!DOCTYPE students SYSTEM "students.dtd">

url导入

<!DOCTYPE students PUBLIC "students.dtd" "url">

schema

怎么写schema约束文件。

新增一个文本编辑器,修改其后缀为.xsd 保存即可生成schema约束文件。

schema文件内容的编写.
targetNamespace名称空间是schema文件重点

xmlns=“url” 是用来引入指定url下写好的xsd文件的,
xmlns:别名=“url” 可以给当前引入的url文件起别名
targetNamespace=“url” 名称空间,是当前schema文件的唯一标识(身份证),到时候根据这个url名称空间来引入。
elementFormDefault=“qualified”

写一个schema 的xsd文件,首先需要导入http://www.w3.org/2001/XMLSchema 然后用里面的schema标签来进行编写

<xsd:schema  xmlns:xsd="http://www.w3.org/2001/XMLSchema"
         targetNamespace="http://www.lxjava.com/xml"
         xmlns="http://www.lxjava.com/xml"
         elementFormDefault="qualified"
>

schema的数据类型,很多,string,int,枚举…都有

schema的标签
<element>声明标签
<simpleType>简单的类型
<complexType>组合类型
<attribute>添加属性

<?xml version="1.0" encoding="UTF-8" ?>

<xsd:schema  xmlns:xsd="http://www.w3.org/2001/XMLSchema"
         targetNamespace="http://www.lxjava.com/xml"
         xmlns="http://www.lxjava.com/xml"
         elementFormDefault="qualified"
>
    
    <!-- 定义一个ageType 放的是integer类型的  取值范围为0-160 -->
    <xsd:simpleType name="ageType">
        <xsd:restriction base="xsd:integer">
            <xsd:minInclusive value="0"/>
            <xsd:maxInclusive value="160"/>
        </xsd:restriction>
    </xsd:simpleType>

 <!-- 定义一个sextype放的是string类型的  枚举所有值出来 -->
    <xsd:simpleType name="sextype">
        <xsd:restriction base="xsd:string">
            <xsd:enumeration value="male"/>
            <xsd:enumeration value="female"/>
        </xsd:restriction>
    </xsd:simpleType>
    
    <!-- 定义一个组合类型的 tearchertype  里面只能放tname,age,sex标签  并且有一个必填的属性t_id.  -->
    <xsd:complexType name="teachertype">
        <xsd:sequence>
            <xsd:element name="tname" type="xsd:string"/>
            <xsd:element name="age" type="ageType"/>
            <xsd:element name="sex" type="sextype"/>
        </xsd:sequence>
        <!-- 声明一个属性  t_id  integer 必填 -->
        <xsd:attribute name="t_id" type="xsd:integer" use="required"/>
    </xsd:complexType>

<!-- 声明一个tearcherstype 容器  里面只能放tearchtype类型 的tearcher标签  -->
    <xsd:complexType name="teacherstype">
        <xsd:sequence>
            <xsd:element name="teacher" type="teachertype" minOccurs="1" maxOccurs="unbounded"/>
        </xsd:sequence>
    </xsd:complexType>

    <xsd:element name="teachers" type="teacherstype"/>
    
</xsd:schema>

如何引入schema文件。

第一 必须 找到schema文件的命名空间的位置, 这相当于schema文件的url,并导入进来
第二 必须通过xmlns=“url” 导入http://www.w3.org/2001/XMLSchema-instance 的实体类schema文件。
第三 使用xmlschema-instance 的实体类schema文件中的 schemaLocation属性,指明xsd文件的位置

<?xml version="1.0" encoding="UTF-8" ?>

<teachers xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xmlns="http://www.lxjava.com/xml"
    xsi:schemaLocation="http://www.lxjava.com/xml  teachers.xsd"
>
    <teacher t_id="01">
        <tname>xuan</tname>
        <age>24</age>
        <sex>male</sex>
    </teacher>
</teachers>

总结

DTD 的数据类型较少,不能限制其输入。
schema 数据类型可以高度自定义,能很好限制xml标签中的数据输入。所以schema文件比较常用。
好,希通过这篇文章 让你学会了怎么写 xml文件的约束,祝早日在自已写框架时,为自已的xml 加上自已的schema约束文件。

  • 10
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值