3、XML約束--DTD約束

一、XML約束概述

 

1、什麼是XML約束?

  • 在xml技術裏,可以編寫一個文檔來約束一個xml文檔的寫法,這稱之爲XML約束

2、XML約束的作用

  • 約束xml文檔的寫法
  • 對xml進行校驗

3、常見的XML約束技術

  • XML DTD(Document Type Definition),全稱爲文檔類型定義
  • XML Schema

二、DTD約束語法

 

1、元素定義

  • 在DTD文檔中使用ELEMENT聲明一個XML元素,語法格式:<!ELEMENT 元素名稱 元素約束>
  • 元素約束可以是元素內容、或存放類型
  • 如爲元素內容:則需要使用()括起來,如:<!ELEMENT 書架 (書名,作者,售價)>  <!ELEMENT 書名 (#PCDATA)>
  • 如爲存放類型,則直接書寫,DTD規範定義瞭如下幾種類型:EMPTY:用於定義空元素,例如<br/> <hr/>    ANY:表示元素內容爲任意類型。
  • 元素內容中可以使用如下方式,描述內容的組成關係
  • 用逗號分隔,表示內容的出現順序必須與聲明時一致。<!ELEMENT MYFILE (TITLE,AUTHOR,EMAIL)>   用|分隔,表示任選其一,即多個只能出現一個<!ELEMENT MYFILE (TITLE|AUTHOR|EMAIL)>
  • 在元素內容中也可以使用+、*、?等符號表示元素出現的次數:+: 一次或多次 (書+)  ?: 0次或一次 (書?)   *: 0次或多次  (書*)
  • 也可使用圓括號( )批量設置,例<!ELEMENT MYFILE ((TITLE*, AUTHOR?, EMAIL)* | COMMENT)>

2、屬性定義

  • dtd文檔中的標籤屬性需通過ATTLIST爲其設置屬性
  • 語法格式:
    <!ATTLIST 元素名 
    屬性名1 屬性類型 屬性約束
    屬性名2 屬性類型 屬性約束
    ……
    >
    屬性聲明舉例:
    <!ATTLIST 商品
    類別 CDATA #REQUIRED
    顏色 CDATA #IMPLIED
    >
    對應XML文件:
    <商品 類別="服裝" 顏色="黃色">…</商品> 
    <商品 類別="服裝">…</商品>  
     
  • 屬性約束:
  • #REQUIRED:必須設置該屬性
  • #IMPLIED:可以設置也可以不設置 
  • #FIXED:說明該屬性的取值固定爲一個值,在 XML 文件中不能爲該屬性設置其它值。使用該元素時無需爲其分配該屬性,XML處理器會自動爲給屬性增加固定值
  • 直接使用默認值:在 XML 中可以設置該值也可以不設置該屬性值。若沒設置則使用默認值。 
  • 舉例:
    <!ATTLIST 頁面作者 
        姓名 CDATA #IMPLIED 
        年齡 CDATA #IMPLIED 
        聯繫信息 CDATA #REQUIRED 
        網站職務 CDATA #FIXED "頁面作者" 
        個人愛好 CDATA "上網"
    > 
     
  • 常用屬性類型
  • CDATA:表示屬性值爲普通文本字符串。
    ENUMERATED 枚舉
    ID唯一的id
    ENTITY(實體)
     
  • 屬性值類型--ENUMERATED
  • 屬性的類型可以是一組取值的列表,在 XML 文件中設置的屬性值只能是這個列表中的某個值(枚舉)
  • <?xml version = "1.0" encoding="GB2312" standalone="yes"?>
    <!DOCTYPE 購物籃 [
    <!ELEMENT 肉 EMPTY>
    <!ATTLIST 肉 品種 ( 雞肉 | 牛肉 | 豬肉 | 魚肉 ) "雞肉">
    ]> 
    <購物籃>
    <肉 品種="魚肉"/>
    <肉 品種="牛肉"/>
    <肉/>
    </購物籃>
     
  • 屬性值類型-- ID,表示屬性的設置值爲一個唯一值,在整個xml中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>
    </聯繫人>
    </聯繫人列表>
     
  • 實體定義 ,實體用於爲一段內容創建一個別名,以後在XML文檔中就可以使用別名引用這段內容了
  • 在DTD定義中,一條<!ENTITY …>語句用於定義一個實體。
  • 實體可分爲兩種類型:引用實體和參數實體
  • 引用實體 
  • 引用實體主要在 XML 文檔中被應用
  • 語法格式:
    <!ENTITY 實體名稱 “實體內容” >:直接轉變成實體內容
    引用方式:&實體名稱;
    舉例:
    <!ENTITY copyright “I am a programmer"> 
    ……
    &copyright;
     
  • 參數實體
  • 參數實體被 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;>
     

3、引入DTD約束的兩種方式

  • DTD的約束可以定義在XML文件內部,如果DTD被定義在了XML內部則XML文檔聲明中standalone="yes"
  • DTD的約束也可以定義在一個獨立的後綴爲.dtd的文件中再由xml文件引入,此時引入此dtd的xml文檔聲明中standalone="no"
  • 注意:.dtd文件應使用UTF-8或Unicode編碼
  • 在xml文件內編寫DTD
    <?xml version="1.0" encoding="UTF-8" standalone="yes"?>
    <!DOCTYPE 書架 [
    <!ELEMENT 書架 (書+)>
    <!ELEMENT 書 (書名,作者,售價)>
    <!ELEMENT 書名 (#PCDATA)>
    <!ELEMENT 作者 (#PCDATA)>
    <!ELEMENT 售價 (#PCDATA)>
    ]>
    <書架>
    <書>
    <書名>Java就業培訓教程</書名>
    <作者>張孝祥</作者>
    <售價>39.00元</售價>
    </書>
    ...
    </書架>
     
  • XML中引用DTD約束
  • XML文件使用 DOCTYPE 聲明語句來指明它所遵循的DTD文件,DOCTYPE聲明語句有兩種形式:
  • 當引用的文件在本地時,採用如下方式:
    <!DOCTYPE 文檔根結點 SYSTEM "DTD文件的URL">
    例如:<!DOCTYPE 書架 SYSTEM “book.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">
     

4、編程校驗XML文檔正確性

  • 默認的情況下IE瀏覽器內置的XML解析器的 約束校驗器是被關閉了的。所以我們需要使用JavaScript手動創建解析器對象,打開約束校驗功能,對XML進行約束校驗。
  • 創建xml文檔解析器對象
        var xmldoc = new ActiveXObject("Microsoft.XMLDOM");
    開啓xml校驗
        xmldoc.validateOnParse = "true";
    裝載xml文檔
        xmldoc.load("book.xml");
    獲取錯誤信息
        xmldoc.parseError.reason;  
        xmldoc.parseError.line
     
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章