XML的约束

  由于xml是一种可扩展的标记语言,我们可以自己定义标签的写法,但我们在实际开发的时候,不能每人都按照自己的想法来写xml文件,因此我们需要规定xml中只能出现的元素。
  xml中的约束技术:dtd约束和schema约束(看懂即可)

一、dtd约束

1、使用dtd定义元素(标签)

(1)语法

  <!ELEMENT 元素名 约束>

(2)简单元素的定义

  简单元素就是没有子元素的元素。

语法:<!ELEMENT name (#PCDATA)>
  (#PCDATA):约束name是字符串类型
  EMPTY:元素为空(没有内容)
  ANY:任意

(3)复杂元素的定义

  复杂元素就是有子元素的元素。

语法:<!ELEMENT 元素名称 (子元素)>
  表示子元素出现的次数:
    +:表示一次或者多次
    ?:表示零次或者一次
    *:表示零次或者多次
  子元素直接使用逗号隔开:表示元素出现的顺序;
  子元素直接用 | 隔开:表示元素只能出现其中的任意一个。

举例:

<?xml version="1.0" encoding="UTF-8"?>
    <!ELEMENT 书架 (书+)>
        <!ELEMENT 书 (书名,作者,售价)>
        <!ELEMENT 书名 (#PCDATA)>
        <!ELEMENT 作者 (#PCDATA)>
        <!ELEMENT 售价 (#PCDATA)>

(4)dtd文件的引用

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

<?xml version="1.0" encoding="UTF-8"?>
    <!--由于book.dtd文件在项目目录下,所以我们直接输入文件名即可>
    <!DOCTYPE 书架 SYSTEM "book.dtd">
    <书架>
        <书>
            <书名></书名>
            <作者></作者>
            <售价></售价>
        </书>
    </书架>

  eclipse中可以实现dtd的快速引入:创建xml文件时,选择next --> Create XML file from a DTD file --> next --> 工作空间选择dtd --> finish。

2、使用dtd定义属性

(1)语法:

  <!ATTLIST 元素名称 属性名称 属性类型 属性的约束>

(2)属性类型

  • CDATA:字符串
    例:
    <!ATTLIST 商品 类别 CDATA #REQUIRED>
    <商品 类别="abc"></商品>
  • 枚举:表示只能在一定的范围内出现值,但是只能每次出现其中的一个
    例:
    <!ATTLIST 商品 颜色 (红色|黄色|蓝色)  #REQUIRED>
    <商品 颜色="红色"></商品>
  • ID:值只能是字母和下划线开头且不能重复
<!ATTLIST 商品 价格 ID   #REQUIRED>
<商品 价格="c001"></商品>

(3)属性的约束

#REQUIRED:属性必须存在

#IMPLIED:属性可有可无

#FIXED: 表示一个固定值,属性的值必须是设置的这个固定值
    <!ATTLIST 商品 品种 CDATA #FIXED "ABC">
    <商品 品种="ABC" />

直接值:如果不写属性,使用默认值;如果写了属性,使用设置那个值
    <!ATTLIST 商品 颜色 CDATA "黄色">         
    <商品 />

(4)定义属性示例一

<!--为了使读者可以看清,所以讲属性进行了换行-->
<!ATTLIST 商品 
       类别 CDATA #REQUIRED 
       颜色 CDATA #IMPLIED
>
<商品 类别="服装"颜色="黄色" />

(5)定义属性示例二

<!DOCTYPE 购物篮 [
    <!ELEMENT 购物篮 (肉+)>
    <!ELEMENT 肉 EMPTY>
    <!ATTLIST 肉 品种 ( 鸡肉 | 牛肉 | 猪肉 | 鱼肉 ) "鸡肉">
]> 

<购物篮>
        <肉 品种="鱼肉"/>
        <肉 品种="牛肉"/>
        <肉/>
</购物篮>

二、schema约束

1、schema的概述

  schema约束符合xml的语法,xml语句。一个xml中可以有多个schema,多个schema使用名称空间区分(类似于java包名)xmlns(XML Namespaces的缩写)。
  schema相较于xml可以支持更多的数据类型,且语法更为复杂,但是schema目前不能替代dtd。

2、schema的案例

(1)schema约束文件

<?xml version='1.0' encoding='UTF-8' ?> 
    <xs:schema xmlns:xs='http://www.w3.org/2001/XMLSchema' //固定的(标准名称空间):表示当前xml文件是一个约束文件
            targetNamespace='http://www.itheima.com' //想使用schema约束文件,就直接通过这个地址引入约束文件
                    > 
        <xs:element name='书架' >
            <xs:complexType>
                <xs:sequence maxOccurs='unbounded' >
                    <xs:element name='书' >
                        <xs:complexType>
                            <xs:sequence>
                                <xs:element name='书名' type='xs:string' />
                                <xs:element name='作者' type='xs:string' />
                                <xs:element name='售价' type='xs:string' />
                            </xs:sequence>
                        </xs:complexType>
                    </xs:element>
                </xs:sequence>
            </xs:complexType>
        </xs:element>
    </xs:schema>

名词解释:
  <sequence>:表示元素的出现的顺序
  <complexType>:表示这是一个复杂元素,有子标签
  maxOccurs="unbounded":表示元素出现的次数,没有限制
  xmlns(XML Namespaces的缩写)默认命名空间,如文件中没有使用前缀,则采用该默认命名空间,如果后面有前缀,命名空间里面的元素或者属性就必须加上前缀,如:例子中的xs。

(3)根据约束文件写xml

<?xml version="1.0" encoding="UTF-8"?>
    <it:书架 xmlns:it="http://www.itheima.com"
                    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
                    xsi:schemaLocation="http://www.itheima.com book.xsd">//引入schema: 名称空间 dtd文件名称(注意空格一定不能漏掉)

        <it:书>
            <it:书名>Java基础</it:书名>
            <it:作者>张三</it:作者>
            <it:售价>99.00元</it:售价>
        </it:书>
    </it:书架>

schema约束的快速引入:
  创建xml文件的时候,选择next --> Create XML file from a DTD file --> next --> 工作空间选择xsd --> finish

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,179评论 5 476
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,229评论 2 380
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,032评论 0 336
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,533评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,531评论 5 365
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,539评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,916评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,574评论 0 256
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,813评论 1 296
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,568评论 2 320
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,654评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,354评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,937评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,918评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,152评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,852评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,378评论 2 342

推荐阅读更多精彩内容

  • 1. XML简介 以下内容来自于http://www.w3school.com.cn/xml 基本知识 XML 和...
    WebSSO阅读 1,889评论 1 7
  • Schema简介 XML Schema也被称为XML Schema定义(XML Schema Definition...
    tobe_superman阅读 5,349评论 0 8
  • 经过两天的奋战,终于把xml简略的过了一遍。 1.1XML介绍 xml是Extensible Markup lan...
    Ystrator阅读 801评论 0 2
  • 一座城市有多大,要看人心有多浅。没有隔阂,万水千山也能轻易抵达,心存芥蒂,近在咫尺也是路远天涯。 曾经年少,我...
    灵轩_f7e9阅读 363评论 0 0
  • 比特币破4万了,1个月多的时间从价格谷底又到了谷峰,圈里的朋友对币市的形容“币圈三月,股市十年”、“币圈三载,人间...
    六便士菇凉阅读 309评论 1 0