美文网首页
XML2 - 约束

XML2 - 约束

作者: 老茂在北京 | 来源:发表于2017-04-01 22:06 被阅读14次
    • 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>
    

    相关文章

      网友评论

          本文标题:XML2 - 约束

          本文链接:https://www.haomeiwen.com/subject/kkcwottx.html