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约束文件。