美文网首页
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 - 约束

    DTD schema schema 与 DTD 的对比: schema符合XML的语法结构 DOM、SAX等容易解...

  • R语言安装tm包报错ERROR: dependency ‘xml

    今天安装R包tm时遇到报错: ERROR: dependency ‘xml2’ is not available ...

  • HTTP

    一、架构与HTTP的关系 1、webservice = http + xml2、rest = http + jso...

  • 初识Ajax

    一、ajax是什么? 1、Asynchronous JavaScript & XML2、web开发的一种技术3、异...

  • LayoutInflater使用注意

    LayoutInflater作用: 1,利用解析器解析xml2,利用反射创建View对象 注意点: 创建view的...

  • WebService与WebApi的区别

    WebService的特征: 1 基于SOAP协议的,数据格式为XML2 只支持HTTP协议3 不是开源的,但...

  • php多维数组转xml2

  • Ajax

    一、说明 1、异步的 Javascript 和 XML2、不是一种编程语言3、无需重新加载网页的情况下更新部分网页...

  • R安装xml遇到的问题 - installation of pa

    系统版本 R版本 xml安装版本: 安装xml2包报错如下: 在网上调研了半天得到的导致结论是pkg-config...

  • R语言爬虫2

    接上篇。 参考文章 大道无形x我有型的文章 安装R包rvest与xml2 爬取数据 以新浪网为例 http://f...

网友评论

      本文标题:XML2 - 约束

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