zoukankan      html  css  js  c++  java
  • DTD约束


    1.DTD(Document Type Definition)文件类型定义是用来约束XML文档,由于XML的可扩展,因此我们用dtd来约束XML文档中的元素(Element)和属性(Attribute).

    a.对元素的声明: (XML文档中允许出现的标签)

    <!ELEMENT 元素名称 元素类型>

    如为元素内容:则需要使用()括起来,如

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

    <!ELEMENT 书名 (#PCDATA)>

    #PCDATA: 表示"书名"中嵌套的内容为普通文本字符串.

    这里的PCDATA被解析的字符数据(parsed character data),PCDATA 是会被解析器解析的文本,与其相反的不会被解析CDATA区域内容

    具体可以参考:http://xuqin.blog.51cto.com/5183168/887799

    如为元素类型,则直接书写,DTD规范定义了如下几种类型:

    EMPTY:用于定义空元素,例如<br/> <hr/>

    ANY:表示元素内容为任意类型。

     

    元素内容中可以使用如下方式,描述内容的组成关系

    用逗号分隔,表示内容的出现顺序必须与声明时一致

       <!ELEMENT MYFILE (TITLE,AUTHOR,EMAIL)>

    • 用|分隔,表示任选其一,即多个只能出现一个(也就是"或"的意思)

       <!ELEMENT MYFILE (TITLE|AUTHOR|EMAIL)>

    元素内容使用空格符分隔,表示出现顺序没有要求

       <!ELEMENT MYFILE (TITLE AUTHOR EMAIL)> *

    在元素内容中也可以使用+、*、?等符号表示元素出现的次数:(含义和在正则表达式中的一致)

    +: 一次或多次 (书+)

    ?: 0次或一次 (书?)

    *: 0次或多次 (书*)

    l也可使用圆括号( )批量设置,例

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

     

    b.对元素的属性定义:

    <!ATTLIST 元素名

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

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

    ……

    >

    例如:

    <!ATTLIST 商品

    类别 CDATA #REQUIRED

    颜色 CDATA #IMPLIED

    >

    •#REQUIRED:必须设置该属性

    •#IMPLIED:可以设置也可以不设置

    •#FIXED:说明该属性的取值固定为一个值,在 XML 文件中不能为该属性设置其它值。但需要为该属性提供这个值

    •直接使用默认值:在 XML 中可以设置该值也可以不设置该属性值。若没设置则使用默认值。

    常用的属性值类型:

    CDATA:表示属性值为普通文本字符串。

    ENUMERATED :相当于枚举类型

    例如:在一个XML文档中:

       1:  <?xml version = "1.0" encoding="GB2312" standalone="yes"?>
       2:  <!DOCTYPE 购物篮 [
       3:      <!ELEMENT  EMPTY>
       4:      <!ATTLIST  品种 ( 鸡肉 | 牛肉 | 猪肉 | 鱼肉 ) "鸡肉"> <!--肉的品种只能是()中的其中一种,默认值"鸡肉"-->
       5:  ]> 
       6:  <购物篮>
       7:      < 品种="鱼肉"/>
       8:      < 品种="牛肉"/>
       9:      </>
      10:  </购物篮>

     

    ID

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

      ID 属性的值只能由字母,下划线开始,不能出现空白字符

      例如:

       1:  <?xml version = "1.0" encoding="GB2312" ?>
       2:   
       3:  <!DOCTYPE 联系人列表[
       4:      <!ELEMENT 联系人列表 ANY>
       5:      <!ELEMENT 联系人(姓名,EMAIL)>
       6:      <!ELEMENT 姓名(#PCDATA)>
       7:      <!ELEMENT EMAIL(#PCDATA)>
       8:      <!ATTLIST 联系人 编号 ID #REQUIRED>
       9:  ]>
      10:   
      11:  <联系人列表>
      12:      <联系人 编号="a1">
      13:          <姓名>张三</姓名>
      14:          <EMAIL>zhang@it315.org</EMAIL>
      15:       </联系人>
      16:      <联系人 编号="a2">
      17:          <姓名>李四</姓名>
      18:          <EMAIL>li@it315.org</EMAIL>
      19:      </联系人>
      20:  </联系人列表>

    ENTITY(实体),在后面的综合例子中展现

     

     

    2.XML文档引用dtd文档进行约束:

    book.xml:

       1:  <?xml version="1.0" encoding="GBK" standalone="no"?>
       2:  <!DOCTYPE 书架 SYSTEM "book.dtd"> <!--从外部引用dtd文档,book.xml与book.dtd在同一目录下,DOCTYPE与SYSTEM 所有字母均大写-->
       3:  <书架>
       4:  <>
       5:      <书名>&bookname;</书名>
       6:      <作者 姓名="王五"/>
       7:      <售价>50元</售价>
       8:      <页面作者 个人爱好="上网" 网站职务="页面作者" 联系信息=""/>
       9:   </>
      10:  </书架>
      11:  <!--
      12:  1. #REQUIRED :网站职务="设计",页面作者元素中一旦写了网站职务属性,那么该属性的值只能写 "页面作者"
      13:  否则报错: Attribute "网站职务" with value "设计" must have a value of "页面作者"
      14:  2.对于属性个人爱好的属性值,你写了,其属性值可以任意更改,但是不写默认为 "上网"
      15:   -->

    book.dtd:

       1:  <!ENTITY % commonType "CDATA">
       2:  <!ENTITY % name "(张三|李四|王五)"><!--参数实体:在dtd文件内部使用-->
       3:  <!ENTITY bookname "java web"> <!--引用实体:在xml文档中通过&bookname;引用-->
       4:   
       5:  <!ELEMENT 书架 (+)>
       6:  <!ELEMENT  (书名,作者,售价,页面作者)>
       7:  <!ELEMENT 书名 (#PCDATA)>
       8:  <!ELEMENT 作者 (#PCDATA)>
       9:  <!ELEMENT 售价 (#PCDATA)>
      10:  <!ELEMENT 页面作者 (#PCDATA)>
      11:  <!ATTLIST 页面作者
      12:     姓名  %commonType; #IMPLIED
      13:     年龄    CDATA #IMPLIED
      14:     联系信息 CDATA #REQUIRED
      15:     网站职务 CDATA #FIXED "页面作者"
      16:     个人爱好 CDATA "上网"   
      17:    >
      18:   <!ATTLIST 作者 
      19:      姓名   %name; #REQUIRED 
      20:   >
      21:   <!--这里相当与:
      22:       姓名  (张三|李四|王五) #REQUIRED
      23:    -->
      24:   <!--
      25:   网站职务 CDATA #FIXED "页面作者":固定值
      26:   个人爱好 CDATA "上网": 默认值-->
      27:   
      28:   
    不论是参数实体还是引用实体都起到了一改全改的作用,提高代码复用性.
    看一下新建的一个html文档:
       1:  <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
       2:  <html xmlns="http://www.w3.org/1999/xhtml">
       3:  <head>
       4:  <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
       5:  <title>无标题文档</title>
       6:  </head>
       7:   
       8:  <body>
       9:  </body>
      10:  </html>
    第一行: DOCTYPE(文档类型定义语句)中PUBLIC关键字:表明该html文件所遵循的是一个由权威机构制定的,公开提供给特定行业或公共使用的DTD文件,而不是某个组织内部的规范文件,我们可以在浏览器的地址栏输入该网址下载到该dtd文件,里面就是对html文档的约束.
    第二行:<html xmlns="http://www.w3.org/1999/xhtml">具体可以参考W3C的教程:http://www.w3school.com.cn/tags/tag_prop_xmlns.asp
    第四行:参照:http://www.w3school.com.cn/tags/tag_meta.asp#meta_prop_http-equiv 其中charset="utf-8"那么浏览器的html解析引擎会以utf-8解码
     
     

    3.最后根据dtd文件来写出相应的xml文档:

     
    <!ENTITY AUTHOR "John Doe">
    <!ENTITY COMPANY "JD Power Tools, Inc.">
    <!ENTITY EMAIL "jd@jd-tools.com">
    <!ELEMENT CATALOG (PRODUCT+)>
    <!ELEMENT PRODUCT
    (SPECIFICATIONS+,OPTIONS?,PRICE+,NOTES?)>
    <!ATTLIST PRODUCT
    NAME CDATA #IMPLIED
    CATEGORY (HandTool|Table|Shop-Professional) "HandTool"
    PARTNUM CDATA #IMPLIED
    PLANT (Pittsburgh|Milwaukee|Chicago) "Chicago"
    INVENTORY (InStock|Backordered|Discontinued) "InStock">
    <!ELEMENT SPECIFICATIONS (#PCDATA)>
    <!ATTLIST SPECIFICATIONS
    WEIGHT CDATA #IMPLIED
    POWER CDATA #IMPLIED>
    <!ELEMENT OPTIONS (#PCDATA)>
    <!ATTLIST OPTIONS
    FINISH (Metal|Polished|Matte) "Matte" 
    ADAPTER (Included|Optional|NotApplicable) "Included"
    CASE (HardShell|Soft|NotApplicable) "HardShell">
    <!ELEMENT PRICE (#PCDATA)>
    <!ATTLIST PRICE
    MSRP CDATA #IMPLIED
    WHOLESALE CDATA #IMPLIED
    STREET CDATA #IMPLIED
    SHIPPING CDATA #IMPLIED>
    <!ELEMENT NOTES (#PCDATA)>
     
    相应的xml文档: (不止一种书写形式)
    <?xml version="1.0" encoding="UTF-8" ?>
    <!DOCTYPE CATALOG SYSTEM "CATALOG.dtd">
    <CATALOG>
        <PRODUCT NAME="电脑桌" CATEGORY="Table" PLANT="Chicago">
            <SPECIFICATIONS>
               产品说明
            </SPECIFICATIONS>
            <OPTIONS>
            
            </OPTIONS>
            <PRICE>
            
            </PRICE>
     
        </PRODUCT>
    </CATALOG>
     
     
  • 相关阅读:
    Ajax学习网址收集
    Crystal Report Download URL and SN
    svn eclipse unable to load default svn client的解决办法
    Effective C++:条款08:别让异常逃离析构函数 (Prevent exceptions from leaving destructors.)
    Effective C++:条款07:为多态基类声明virtual析构函数 (Declare destructors virtual in polymorphic base classes.)
    Effective C++:条款06:若不想使用编译器自动生成的函数,就该明确拒绝 (Explicitly disallow the use of compliergenerated functions you do not want.)
    #define高级教程
    Effective C++:条款04:确定对象被使用前已先被初始化 (Make sure that objects are initialized before they're used.)
    Effective C++:条款05:了解C++默默编写并调用哪些函数 (Know what functions C++ silently writes and calls.)
    Linq 调用存储过程(转)
  • 原文地址:https://www.cnblogs.com/yiqiu2324/p/3537881.html
Copyright © 2011-2022 走看看