首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >XML约束

XML约束

作者头像
木瓜煲鸡脚
发布2019-07-22 16:10:38
6160
发布2019-07-22 16:10:38
举报

XML约束

  1. 什么是约束
  2. DTD约束
  3. Schema约束

什么是约束

由于XML的标签是完全自定义的可以去写任何标签,标签内也可以写任何内容,为了去规范去定义只能有哪些标签,标签的内容只能有哪些类型只能是什么。这个时候就需要写约束文件来应用到需要的XML里面。约束有两种方式一种是dtd,第二种是schema,前者相对简单但功能相比schema较弱

dtd约束

首先导入dtd约束

一种是直接写在xml里面

声明语句<!DOCTYPE 根元素[元素定义都在其中]>


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

<!DOCTYPE persons[
    <!ELEMENT students (student*)>
    <!ELEMENT student (name,age,sex)>
    <!ELEMENT name (#PCDATA)>
    <!ELEMENT age (#PCDATA)>
    <!ELEMENT sex (#PCDATA)>
    <!ATTLIST student number ID #REQUIRED>
]>

<persons>

    <person>
        <name></name>
        <age></age>
        <sex></sex>
    </person>

</persons>

第二种是外部导入

声明语句

本地<!DOCTYPE 根元素 SYSTEM "文件名"

网络<!DOCTYPE 根元素 PUBLIC "地址" "文件名">

student.dtd

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

student.xml

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

<!DOCTYPE students SYSTEM "student.dtd">

<students>

    <student number="a001">
        <name>张三</name>
            <age>18</age>
            <sex>男</sex>
        </student>

    <student number="a002">
        <name>李四</name>
            <age>20</age>
            <sex>男</sex>
    </student>

</students>

dtd的语法

在 DTD 中,XML 元素通过元素声明来进行声明。元素声明语句

<!ELEMENT 元素名称 类型>

<!ELEMENT 元素名称 (元素内容)>

类型有三种
EMPTY:空内容的元素
ANY:内容为任何形式
(#PCDATA):内容不包含子元素,即只能是文本内容

定义一个空类型的元素
<!ELEMENT student EMPTY>
那么XML里只能这么写
<student/>

定义一个可以填任意内容的元素
<!ELEMENT student ANY>
那么XML里这个元素可以这样写
<student>
    我是学生
    <age></age>
    <name></name>
</student>

定义一个内容只能是文本的元素
<!ELEMENT student (#PCDATA)>
那么XML里这个元素中不能包含子元素<student>
    我是学生
</student>
声明元素包含的子元素有且仅出现一次
<!ELEMENT 元素名 (子元素)>
声明元素包含的子元素至少一次
<!ELEMENT 元素名 (子元素+)>
声明元素包含的子元素可以有0次或多次
<!ELEMENT 元素名 (子元素*)>
声明元素包含的子元素只能出现0次或1次
<!ELEMENT 元素名 (子元素?)>
声明元素包含的子元素选其一"或者"的关系
<!ELEMENT 元素名 (子元素1|子元素2)>
多个子元素顺序要按照dtd中声明的顺序

定义包含子元素的元素
<!ELEMENT books (book*)>
<!ELEMENT book (name,author,version)>
<!ELEMENT name (#PCDATA)>
<!ELEMENT author (#PCDATA)>
<!ELEMENT version (#PCDATA)>

在XML中
<books>
    <book>
        <name>书1</name>
        <author>作者1</author>
        <version>1.0</author>
    </book>
    <book>
        <name>书1</name>
        <author>作者1</author>
        <version>1.0</author>
    </book>
</books>

属性声明

声明语句<!ATTLIST 元素名 属性名 属性类型 默认值 >

属性类型比如有

CDATA:字符类型

(en1|en2|en3····):枚举类型值只能在其中

ID:值不能有一样的

默认值有

"值":直接给出默认值

#REQUIRED:标注此属性必须写

#IMPLIED:此属性可以不写

#FIXED "值" :此属性值是固定的给出的值

dtd中
<!ELEMENT student ANY>
<!ATTLIST student sex (男|女) #REQUIRED>

xml中 <student sex="男"></student> 默认值为#REQUIRED则student的sex属性一定得写

还有实体声明

声明语句

<!ENTITY 实体名 "实体值">

这样通过引用实体来引用某些值

引用语句: &实体名;

dtd中
<!ELEMENT student ANY>
<!ATTLIST student sex (男|女) #REQUIRED><!ENTITY a "男">

那么xml中就可以这样写 <student sex="&a;"></student>

scheme约束

XML Schema 可针对未来的需求进行扩展 XML Schema 更完善,功能更强大 XML Schema 基于 XML 编写 XML Schema 支持数据类型 XML Schema 支持命名空间

定义简单元素

<xs:element name="xxx" type="yyy"/>

就是不包含子元素,内容类型直接定义为数据类型

或者自定义类型

有复杂类型和简单类型

可以直接写在标签内部,或者在外面定义

<xs:element name="employee">
  <xs:complexType>
    <xs:sequence>
      <xs:element name="firstname" type="xs:string"/>
      <xs:element name="lastname" type="xs:string"/>
    </xs:sequence>
  </xs:complexType>
</xs:element>
<xs:element name="employee" type="personinfo"/>

<xs:complexType name="personinfo">
  <xs:sequence>
    <xs:element name="firstname" type="xs:string"/>
    <xs:element name="lastname" type="xs:string"/>
  </xs:sequence>
</xs:complexType>

属性的定义

<xs:attribute name="xxx" type="xxx"/>

除此之外还有各种指示器,或者限制来约束值的范围等

笔记目的 : 对约束做简单了解会写一点简单的约束能看得懂外部导入的约束

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2019-07-18,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 IT那个小笔记 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档