天天看點

XML限制——DTD限制

參考: 方立勳老師的講課視訊.

什麼是XML限制

  •在XML技術裡,可以編寫一個文檔來限制一個XML文檔的書寫規範,這稱之為XML限制。

為什麼需要XML限制

常用的限制技術

  •XML DTD

  •XML Schema

DTD(Document Type Definition),全稱為文檔類型定義

編寫DTD限制的兩種方式:

  lDTD限制即可以作為一個單獨的檔案編寫,也可以在XML檔案内編寫。

  

XML檔案使用 DOCTYPE 聲明語句來指明它所遵循的DTD檔案,DOCTYPE聲明語句有兩種形式: 

•當引用的檔案在本地時,采用如下方式:

  <!DOCTYPE 文檔根結點 SYSTEM "DTD檔案的URL">

  例如: <!DOCTYPE 書架 SYSTEM “book.dtd”>。在xml檔案中手寫一下。

•當引用的檔案是一個公共的檔案時,采用如下方式: 

  <!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文檔中使用ELEMENT聲明一個XML元素,文法格式如下所示:

   <!ELEMENT 元素名稱 元素類型>

元素類型可以是元素内容、或類型

•如為元素内容:則需要使用()括起來,如

<!ELEMENT 書架 (書名,作者,售價)>

<!ELEMENT 書名 (#PCDATA)>

•如為元素類型,則直接書寫,DTD規範定義了如下幾種類型:

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

•ANY:表示元素内容為任意類型。

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

•用逗号分隔,表示内容的出現順序必須與聲明時一緻。<!ELEMENT MYFILE (TITLE,AUTHOR,EMAIL)>

• 用|分隔,表示任選其一,即多個隻能出現一個

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

•元素内容使用空白符分隔,表示出現順序沒有要求:<!ELEMENT MYFILE (TITLE AUTHOR EMAIL)> *

l在元素内容中也可以使用+、*、?等符号表示元素出現的次數:

  +: 一次或多次 (書+)

   ?: 0次或一次 (書?)

   *: 0次或多次  (書*)

也可使用圓括号( )批量設定,例

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

屬性定義:

xml文檔中的标簽屬性需通過ATTLIST為其設定屬性

文法格式:

  <!ATTLIST 元素名

  屬性名1 屬性值類型 設定說明

  屬性名2 屬性值類型 設定說明

  ……

  >

屬性聲明舉例:

<!ATTLIST 商品

  類别 CDATA #REQUIRED

  顔色 CDATA #IMPLIED

>

對應XML檔案:

  <商品 類别="服裝" 顔色="黃色">…</商品>

  <商品 類别="服裝">…</商品> 

設定說明:

•#REQUIRED:必須設定該屬性

•#IMPLIED:可以設定也可以不設定

•#FIXED:說明該屬性的取值固定為一個值,在 XML 檔案中不能為該屬性設定其它值。但需要為該屬性提供這個值

直接使用預設值:在 XML 中可以設定該值也可以不設定該屬性值。若沒設定則使用預設值。

舉例:

常用屬性值類型:

CDATA:表示屬性值為普通文本字元串。

ENUMERATED

ID

ENTITY(實體)

屬性值類型ENUMERATED : 

屬性的類型可以是一組取值的清單,在 XML 檔案中設定的屬性值隻能是這個清單中的某個值(枚舉)

屬性值類型ID :

表示屬性的設定值為一個唯一值。ID 屬性的值隻能由字母,下劃線開始,不能出現空白字元

實體定義:

實體用于為一段内容建立一個别名,以後在XML文檔中就可以使用别名引用這段内容了。

在DTD定義中,一條<!ENTITY …>語句用于定義一個實體。

實體可分為兩種類型:引用實體和參數實體。

引用實體:

  引用實體主要在 XML 文檔中被應用

  文法格式:

  •<!ENTITY 實體名稱 “實體内容” >:直接轉變成實體内容

  引用方式:

  &實體名稱;

參數實體:

參數實體被 DTD 檔案自身使用

   <!ENTITY % 實體名稱 "實體内容" >

引用方式:

%實體名稱;

舉例1:

舉例2: