XML2 - 约束

  • DTD
  • schema

schema 与 DTD 的对比:

  • schema符合XML的语法结构
  • DOM、SAX等容易解析出XML Schema
  • Schema对 名称空间 支持得比较好
  • Schema支持更多的数据类型、自定义的数据类型
  • 约束能力强大
  • 不能像DTD一样定义实体,比DTD更复杂

DTD

Document Type Definition 全文档类型定义

book.dtd 文件

<?xml version="1.0" encoding="UTF-8"?>
<!ELEMENT 书架 (书)> //复杂标签,只能有一个根节点为书
<!ELEMENT 书 (书名,售价,作者,简介)> 
<!ELEMENT 书名 (#PCDATA)> //简单标签
<!ELEMENT 作者 (#PCDATA)>
<!ELEMENT 售价 (#PCDATA)>
<!ELEMENT 简介 (#PCDATA)>

引用DTD,如下xml文件

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

<!--引入DTD文件-->
<!DOCTYPE 书架 SYSTEM "book.dtd"> 

<书架>
    <书>
        <书名>JavaWeb开发大全</书名>
        <售价>g</售价>
        <作者>34</作者>
        <简介>不错啊</简介>
    </书>
</书架>

DTD的元素定义:

 <!ELEMENT 元素名称 使用规则>

使用规则如下:

使用规则 含义
(#PCDATA) 指示元素的主体内容只能是普通的文本.(Parsed Character Data)
EMPTY 用于指示元素不能包含任何子元素和文本,仅可以使用属性。比如
ANY 用于指示元素的主体内容为任意类型。
(子元素) 指示元素中包含的子元素
(子元素) 案例
逗号分开,说明必须按照声明顺序去编写XML文档 <!ELEMENT FILE (TITLE,AUTHOR,EMAIL)
用“ ”分开,说明任选其一 <!ELEMENT FILE (TITLE AUTHOR EMAIL)
元素后面没有+*? 表示必须且只能出现一次
元素后面 + 表示至少出现一次,一次或多次
元素后面 * 表示可有可无,零次、一次或多次
元素后面 ? 表示可以有也可以无,有的话只能有一次。零次或一次

示例

<!ELEMENT MYFILE ((TITLE*, AUTHOR?, EMAIL)*| COMMENT)>

DTD属性定义

 <!ATTLIST 元素名称
     属性名 属性类型 约束
     属性名 属性类型 约束
     ......
 >
属性类型 含义
CDATA 属性的取值为普通的文本字符串
ENUMERATED 枚举,只能从枚举列表中任选其一,如(鸡肉 牛肉 猪肉 鱼肉)
ID 属性的取值不能重复(不能只写数字)
约束 含义
#REQUIRED 属性必须出现
#IMPLIED 属性可有可无
#FIXED 属性的取值为一个固定值。语法:#FIXED "固定值"
直接值 属性的取值为该默认值

示例

<!ATTLIST 页面作者 
            姓名 CDATA #IMPLIED 
            年龄 CDATA #IMPLIED 
            联系信息 CDATA #REQUIRED 
            网站职务 CDATA #FIXED "页面作者" 
            个人爱好 CDATA "上网"
> 

DTD 与 XML文档关联的三种方式

  • 使用内部DTD 格式
  • 使用外部DTD
  • 使用网络DTD
<!--内部关联-->
<!DOCTYPE  根节点  [DTD的代码  ]>
   <!DOCTYPE 书架 [
         <!ELEMENT 书架 (书+)>     
         !ELEMENT 书 (书名,作者,售价)>             
        <!ELEMENT 书名 (#PCDATA)>
    ]>

<!--外部关联-->
<!DOCTYPE  根节点  SYSTEM  “DTD的地址”   >

<!--网络关联-->
<!DOCTYPE  根节点   PUBLIC   “DTD的名称”  “DTD的地址” >

示例 使用内部DTD

<?xml version = "1.0" encoding="GB2312" standalone="yes"?>
        <!DOCTYPE 购物篮 [
                <!ELEMENT 肉 EMPTY>
                <!ATTLIST 肉 品种 ( 鸡肉 | 牛肉 | 猪肉 | 鱼肉 ) "鸡肉">
            ]> 
<购物篮>
<肉 品种="鱼肉"/>
<肉 品种="牛肉"/>
<肉/>
</购物篮>
DTD的实体定义
  • 实体用于为一段内容创建一个别名,可在XML文档中引用这段内容

    DTD中定义:<!ENTITY 别名 “值”>
    XML中引用:&别名
    

schame

book.xsd文件

<?xml version="1.0" encoding="UTF-8"?>
<!--
       在根节点上,使用属性xmlns(xml namespace),引入W3C的名称
       属性 targetNamespace  用于指定Schame文档中声明的元素属于哪个命名空间
       属性 elementFormDefault     qualified 质量好的          unqualified质量不好的

-->
<schema xmlns="http://www.w3.org/2001/XMLSchema" targetNamespace="http://www.mango.cool/110" elementFormDefault="qualified">
    
<element name="书架">
    <complexType>
    <sequence>
        <element name="书">
        <!-- 复杂的元素 -->
        <complexType>
            <!-- 有顺序的 -->
            <sequence>
                <!-- 简单元素 -->
                <element name="书名" type="string"></element>
                <element name="作者" type="string"></element>
                <element name="简介" type="string"></element>
            </sequence>
            
            <!-- 书的属性 -->
            <attribute name="出版社" type="string" use="required"></attribute> 
        </complexType>
     </element>
    </sequence>
 </complexType>
</element>
</schema>

book.xml 文件

<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!-- 
    *引入W3C名称空间,我是实例文档
        *xmlns=""
    *引入自己编写的schema的文档
        *xmlns=""
    *问题:元素不能有相同的属性名称
        *解决 :起别名        :aa
        *技巧:再出现概率较小的标签上起别名
    *引入自己编写的schema文档的地址
        *schemalocation属性是W3C提供的,如果W3C名称空间有别名的haul,先把别名协商
            
 -->
<书架 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
        xmlns="http://www.mango.cool/110"
        xsi:schemaLocation="http://www.mango.cool/110 book.xsd">
    <书>
        <书名>JavaWeb开发大全</书名>
        <作者>34</作者>
        <简介>不错啊</简介>
    </书>
    
</书架>

Schame约束,开发XML的过程

W3C预先定义元素和属性 --> schame文档 --> xml文档

名称空间的概念

每个约束文档都可以被赋予一个唯一的名称空间,名称空间用一个唯一的URI表示;尽管以http://开始,但是并不指向一个包含模式定义的文件。事实上,该url不指向任何文件,只是一个分配的名字

schema 示例 包含两个.xsd文件,一个.xml文件
company.xsd

<?xml version="1.0" encoding="UTF-8"?>
<schema xmlns="http://www.w3.org/2001/XMLSchema" 
targetNamespace="http://www.example.org/company" 
elementFormDefault="qualified">
    <element name="company">
        <complexType>
            <sequence>
                <element name="employee">
                    <complexType>
                        <sequence>
                            <!-- 引用任何一个元素 -->
                            <any></any>
                            <!-- 员工名称 -->
                            <element name="name">
                                <complexType>
                                    <simpleContent>
                                        <extension base="string"></extension>
                                    </simpleContent>
                                    <attribute name="salary" type="double"></attribute>
                                </complexType>
                            </element>
                        </sequence>
                        <!-- 为employee元素添加属性 -->
                        <attribute name="age" type="int"></attribute>
                    </complexType>
                </element>
            </sequence>
        </complexType>
    </element>
</schema>


<company>
    <employee>
        <abc></abc>
    </employee>
</company>

department.xsd

<?xml version="1.0" encoding="UTF-8"?>
<schema 
    xmlns="http://www.w3.org/2001/XMLSchema" 
    targetNamespace="http://www.example.org/department" 
    elementFormDefault="qualified">
    <!-- 部门名称 -->
    <element name="name" type="string"></element>
    
</schema>

company.xml

<?xml version="1.0" encoding="UTF-8"?>
<!-- 数据文件 引用多个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" 
>
    <employee age="30">
        <!-- 部门名称 --> 
        <dept:name>人力资源部</dept:name>
        <!-- 员工名称 -->
        <name salary="3000.00">王晓晓</name>   
    </employee>
</company>
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 219,490评论 6 508
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 93,581评论 3 395
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 165,830评论 0 356
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,957评论 1 295
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,974评论 6 393
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,754评论 1 307
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,464评论 3 420
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,357评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,847评论 1 317
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,995评论 3 338
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 40,137评论 1 351
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,819评论 5 346
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,482评论 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 32,023评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 33,149评论 1 272
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,409评论 3 373
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 45,086评论 2 355

推荐阅读更多精彩内容

  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 134,672评论 18 139
  • 1. XML简介 以下内容来自于http://www.w3school.com.cn/xml 基本知识 XML 和...
    WebSSO阅读 1,916评论 1 7
  • 1. XML总结 1.1. XML简介 XML : 可扩展的标记语言。(和HTML非常类似的) 可扩展的。 自定义...
    Ethan_Walker阅读 3,034评论 0 12
  • 1、XML的语法 文档声明写法: <?xml version="1.0" ?>文档声明必须出现在xml文件...
    来个芒果阅读 1,287评论 0 1
  • 初恋是什么?初恋是一面镜子,一面干净得可以看到毛细孔的镜子。 高考前,作为艺术特长生的她已经确定了学校,他对她说:...
    阿凡提的驴阅读 328评论 1 2