天天看点

XML约束、如何在xml中引入dtd、dtd语法、ENTITY(实体)

一、XML约束概述

1、什么是XML约束?

    在xml技术里,可以编写一个文档来约束一个xml文档的写法,这称之为XML约束。

2、为什么要使用XML约束?

    我们从网上下载了一个开源框架,这个开源框架是使用XML作为配置文件的,这时候框架的设计者就需要约束我们配置文件的写法。

3、XML约束的作用

    约束xml文档的写法

    对xml进行校验

4、常见的XML约束技术

XML DTD     //文件类型定义(document type definition)

XML Schema  //schema:模式,略图

二、如何在xml中引入dtd

(一)外部引入

    可以将dtd的约束内容写在外置的dtd文件中,这个文件后缀必须为.dtd,而文件保存时必须用utf-8编码保存,再在xml文件中使用:

    ①<!DOCTYPE 根元素名称  SYSTEM 文件的位置>

    如果写的是SYSTEM表明当前引入的dtd在当前文件系统中,后面制定的文件位置是当前硬盘中的位置

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

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

<书架>

       <书>

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

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

              <售价>39.00元</售价>

       </书>

       <书>

              <书名>JavaScript网页开发</书名>

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

              <售价>28.00元</售价>

       </书>

</书架>

文件:book.dtd

       <!ELEMENT 书架 (书+)>

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

       <!ELEMENT 书名 (#PCDATA)>

       <!ELEMENT 作者 (#PCDATA)>

       <!ELEMENT 售价 (#PCDATA)>

    ②<!DOCTYPE 文档根节点 PUBLIC "DTD名称" "DTD文件的URL">

如果写的是PUBLIC表明当前引入的dtd在网络公共位置中,后面要指明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">

(二)内部引入

直接在xml中书写dtd

      <!DOCTYPE 根元素名称[

        dtd约束....

      ]>

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

<!DOCTYPE 书架 [

     <!ELEMENT 书架 (书+)>

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

     <!ELEMENT 书名 (#PCDATA)>

     <!ELEMENT 作者 (#PCDATA)>

     <!ELEMENT 售价 (#PCDATA)>

]>

<书架>

     <书>

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

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

         <售价>39.00元</售价>

     </书>

     ...

</书架>

三、dtd语法

(一)元素

          <!ELEMENT 元素名称 元素约束>

   a、元素约束:

                存放类型:ANY/EMPTY (存放任意类型/不能存放任何类型)

b、元素约束:子元素的列表,将可以包含的子元素用小括号括起来

     ①子元素之间可以使用逗号进行分割,表明子元素必须按照顺序出现

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

     ②子元素之间可以使用竖线进行分割,表示子元素只出现其中之一

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

     ③#PCDATA 表明包含标签体

<!ELEMENT 书名 (#PCDATA)>

      ④ +   :   一次或多次,如:  <!ELEMENT 书架 (书+)>

      ⑤ ?   :   0次或一次,如:  <!ELEMENT 书架 (书?)>

      ⑥ *   :   0次或多次,如:   <!ELEMENT 书架 (书*)>

⑦也可以使用小括号进行组的操作:

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

(二)属性

(ATTLIST:attribute [ə'trɪbjuːt](属性)list简写)

         <!ATTLIST 元素名

              属性名1 属性类型  属性约束

              属性名2 属性类型  属性约束

.....

         >

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

<!DOCTYPE 购物篮 [

  <!ELEMENT 肉 EMPTY>

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

]>

<购物篮>

  <肉 品种="鱼肉"/>

  <肉 品种="牛肉"/>

  <肉/>

</购物篮>

Ⅰ、属性类型

      ①CDATA:表示属性的值是一个普通字符串

      ②ENUMERATED : 属性的值是一个枚举列表中的值。属性的类型可以是一组取值的列表,在 XML 文件中设置的属性值只能是这个列表中的某个值(枚举)。

      ③ID: 表明属性的值必须在整个文档中都是唯一的,如果有重复的id则校验不通过,ID 属性的值只能由字母,下划线开始,数字不能打头,不能出现空白字符

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

<!DOCTYPE 联系人列表[

     <!ELEMENT 联系人列表 ANY>

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

     <!ELEMENT 姓名 (#PCDATA)>

     <!ELEMENT EMAIL (#PCDATA)>

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

]>

<联系人列表>

     <联系人 编号="a1">

         <姓名>张三</姓名>

         <EMAIL>[email protected]</EMAIL>

     </联系人>

     <联系人 编号="a2">

         <姓名>李四</姓名>

         <EMAIL>[email protected]</EMAIL>

     </联系人>

</联系人列表>

Ⅱ、属性约束

     ①#REQUIRED  --- 表明当前属性是一个必须存在的属性,如果这样的属性不存在则在校验时会报错。

     ②#IMPLIED --- (imply 隐含)表明当前属性是一个可选的属性,可以有也可以没有。

     ③#FIXED '固定值' --- 表明当前属性具有一个固定值,这样的属性不需要进行赋值,自动就会取这个固定值为值。如果这样的属性指定了一个不是固定值的值则校验报错。

     ④'默认值'  ---  表明当前属性具有一个默认值,如果给了其他的值就用其他值,如果没有给值则取这个默认值。

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

<!DOCTYPE 书架 [

  <!ELEMENT 书架 (书+)>

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

  <!ELEMENT 书名 (#PCDATA)>

  <!ELEMENT 作者 (#PCDATA)>

  <!ELEMENT 售价 (#PCDATA)>

  <!ATTLIST  书

                书号   ID #REQUIRED

                出版社 CDATA #REQUIRED

                种类   CDATA #IMPLIED

                网址   CDATA #FIXED "www.taobao.com"

                版次   CDATA  "第一版">

    <!ENTITY  press "清华大学出版社">

]>

<书架>

  <书  出版社="&press;"  种类="计算机软件"  版次="第二版"  书号="a1222">

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

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

       <售价>39.00元</售价>

  </书>

   <书 出版社="清华大学出版社" 书号="a1223">

       <书名>JavaScript网页开发</书名>

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

       <售价>28.00元</售价>

  </书>

</书架>

四、ENTITY(实体)

 (entity  n  实体,本质)

         <!ENTITY >就是对一大段内容的引用,可以简化代码的复用。

实体分类:

         ①引用实体:在xml中引用的实体叫做引用实体

              语法格式: <!ENTITY 实体名称 “实体内容” >

              引用方式:  &实体名称;

         ②参数实体:在dtd中引用的实体叫做参数实体

              <!ENTITY % 实体名称 "实体内容">

              %实体名称;

举例1:

      <!ENTITY % TAG_NAMES "姓名 | EMAIL | 电话 | 地址">

    <!ELEMENT 个人信息 (%TAG_NAMES; | 生日)>

      <!ELEMENT 客户信息 (%TAG_NAMES; | 公司名)>

举例2:

<!ENTITY % common.attributes

      " id ID #IMPLIED

     account CDATA #REQUIRED "

>

...

<!ATTLIST purchaseOrder %common.attributes;>

<!ATTLIST item %common.attributes;>