XML约束

一、为什么需要约束

  • XML都是用户自定义的标签,若出现小小的错误,软件程序将不能正确地获取文件中的内容而报错。(如:Tomcat)
  • XML技术中,可以编写一个文档来约束一个XML的书写规范,这个文档称之为约束。
  • 两个概念:格式良好的XML:遵循XML语法的XML。    有效的XML:遵循约束文档的XML。
  • 总之:约束文档定义了在XML中允许出现的元素名称、属性及元素出现的顺序等等。

二、常用的约束技术

  • XML DTD
  • XDR
  • SOX
  • XML Schema

三、DTD快速入门

  • DTD(Document Type Definition):文档类型定义。
  • 作用:约束XML的书写规范。

四、验证XML的有效性

  • 如何根据DTD中定义的内容来验证XML书写是否正确呢?
  • 答:需要软件程序,即解析器
  • 根据能否对XML文档进行约束模式校验,可以将解析器分为两类:非校验解析器,如IE;校验解析器。

五、编程校验XML文档的正确性

  • IE5以上浏览器内置了XML解析工具:Microsoft.XMLDOM,开发人员可以编写JavaScript代码,利用这个解析工具装载xml文件,并对xml文件进行dtd验证。
  • 创建xml文档解析器对象
  • var xmldoc = new ActiveXObject("Microsoft.XMLDOM");
  • 开启xml校验
  • xmldoc.validateOnParse="true"
  • 装载xml文档
  • xmldoc.load("book.xml");
  • 获取错误信息
  • xmldoc.parseError.reason
  • xmldoc.parseError.line

六、编写DTD的方式

  • DTD约束文档可以在XML文档中直接定义,也可以作为单独的文档进行编写(单独的文档必须以UTF-8编码进行保存)。
  • 在XML文档中编写DTD示例

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

<!DOCTYPE 书架 [

       <!ELEMENT 书架 (+)>

       <!ELEMENT (书名,作者,售价)>

       <!ELEMENT 书名 (#PCDATA)>

       <!ELEMENT 作者 (#PCDATA)>

        <!ELEMENT 售价 (#PCDATA)>

]>

<书架>

          <>

                  <书名>Java就业培训教程</书名>

                  <作者>张孝祥</作者>

                  <售价>39.00</售价>

          </>

           ...

</书架>

七、引入外部DTD文档

XML使用DOCTYPE声明语句来指明它所遵循的DTD文档,有两种形式:

1. 当引用的DTD文档在本地时,采用如下方式:

<!DOCTYPE 根元素 SYSTEM "DTD文档路径">

如:<!DOCTYPE 书架 SYSTEM "book.dtd">

2. 当引用的DTD文档在公共网络上,采用如下方式:

<!DOCTYPE 根元素 PUBLIC "DTD名称" "DTD文档的URL">

如:<!DOCTYPE web-app PUBLIC "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN"

  "http://java.sun.com/dtd/web-app_2_3.dtd">

八、DTD语法细节

DTD文档的语法主要涉及一下内容的定义:

  • 定义元素
  • 定义属性
  • 定义实体

九、DTD - 定义元素

  • 在DTD文档中使用ELEMENT关键字来声明一个XML元素
  • 语法:<!ELEMENT 元素名称 使用规则>
  • 使用规则如下:
  • (#PCDATA):指示元素的主体内容只能是普通的文本.(Parsed Character Data)

    EMPTY:用于指示元素的主体为空。比如<br/>

    ANY:用于指示元素的主体内容为任意类型。

    (子元素):指示元素中包含的子元素

  • 定义子元素及描述它们的关系:

    如果子元素用逗号分开,说明必须按照声明顺序去编写XML文档。

    : <!ELEMENT FILE (TITLE,AUTHOR,EMAIL)

    如果子元素用“|”分开,说明任选其一。

    :<!ELEMENT FILE (TITLE|AUTHOR|EMAIL)

    +、*、?来表示元素出现的次数

    如果元素后面没有+*?:表示必须且只能出现一次

    +:表示至少出现一次,一次或多次

    *:表示可有可无,零次、一次或多次

    ?:表示可以有也可以无,有的话只能有一次。零次或一次

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

十、DTD - 定义属性

  • DTD文档中使用ATTLIST关键字来为一个元素声明属性
  • <!ATTLIST 元素名

      属性名1 属性值类型 设置说明

      属性名2 属性值类型 设置说明

     

    >

  • <!ATTLIST 商品

      类别 CDATA #REQUIRED

      颜色 CDATA #IMPLIED

    >

    对应的XML为:<商品 类别=“服装” 颜色=“黄色”/>

  • 属性值类型:

  • CDATA:表示属性的取值为普通的文本字符串

    ENUMERATED (DTD没有此关键字):表示枚举,只能从枚举列表中任选其一,如(鸡肉|牛肉|猪肉|鱼肉)

    ID:表示属性的取值不能重复

  • 设置说明

    #REQUIRED:表示该属性必须出现

    #IMPLIED:表示该属性可有可无

    #FIXED:表示属性的取值为一个固定值。语法:#FIXED "固定值"

    直接值:表示属性的取值为该默认值

 

十一、定义属性示例

 

 

1<!ATTLIST 页面作者

       姓名 CDATA #IMPLIED

       年龄 CDATA #IMPLIED

       联系信息 CDATA #REQUIRED

       网站职务 CDATA #FIXED "页面作者"

       个人爱好 CDATA "上网"

       >

 

2<?xml version = "1.0" encoding="GB2312" standalone="yes"?>

<!DOCTYPE 购物篮 [

  <!ELEMENT EMPTY>

  <!ATTLIST 肉 品种 ( 鸡肉 | 牛肉 | 猪肉 | 鱼肉 ) "鸡肉">

]>

<购物篮>

  <肉 品种="鱼肉"/>

  <肉 品种="牛肉"/>

  </>

</购物篮>

3、ID表示属性的设置值为一个唯一值。

<?xml version = "1.0" encoding="GB2312" ?>

 

<!DOCTYPE 联系人列表[

  <!ELEMENT 联系人列表 ANY>

  <!ELEMENT 联系人(姓名,EMAIL)>

  <!ELEMENT 姓名(#PCDATA)>

  <!ELEMENT EMAIL(#PCDATA)>

  <!ATTLIST 联系人 编号 ID #REQUIRED>

]>

<联系人列表>

  <联系人 编号=“a">

  <姓名>张三</姓名>

  <EMAIL>zhang@it315.org</EMAIL>

     </联系人>

  <联系人 编号=“b">

  <姓名>李四</姓名>

  <EMAIL>li@it315.org</EMAIL>

  </联系人>

</联系人列表>

 

十二、DTD - 定义实体

  • ​​​​​​​定义实体就是为一段内容指定一个名称,使用时通过这个名称就可以引用其所代表的内容。
  • 在DTD文档中使用ENTITY关键字来声明一个实体。
  • 实体可分为:引用实体和参数实体,两者的语法不同

​​​​​​​十三、定义引用实体

  • 概念:在DTD中定义,在XML中使用
  • 语法:<!ENTITY 实体名称 "实体内容">
  • 引用方式(注意是在XML中使用):&实体名称;
  • 举例:DTD中定义:<!ENTITY copyrigh "microsoft">  XML中引用:&copyright

十四、定义参数实体

  • 概念:在DTD中定义,在DTD中使用
  • 语法:<!ENTITY % TAG_NAMES "姓名|EMAIL|电话|地址">
  • 引用方式(注意是在DTD中使用):%实体名称;
  • 举例:
  • DTD中定义:<!ENTITY % TAG_NAMES "姓名|EMAIL|电话|地址">
  • DTD中引用:<!ELEMENT 个人信息 (%TAG_NAMES;|生日)>   <!ELEMENT 客户信息 (%TAG_NAMES;|公司名)

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值