XML知識點滴(6)
(引用文章,版權歸作者,如需删除請聯系我)
元素類型聲明
n 元素類型聲明不但說明了每個文檔中可能存在的元素,給出了元素的名稱,而且給出了元素具體的類型。
n 一個XML元素可以為空,也可以隻包含字元資料,還可以有若幹個子元素,而這些子元素同時又可以有它們的子元素。
n 元素類型聲明采用如下的文法格式:
<!ELEMENT 元素名稱 元素内容說明>
元素内容說明可以指明五種可能的元素内容形式:#PCDATA、子元素、混合内容、EMPTY、ANY。
#PCDATA
n 關鍵字#PCDATA說明元素包含字元資料。
例如:
<?xml version="1.0" encoding="gb2312"?>
<!DOCTYPE hr[
<!ELEMENT hr (#PCDATA)>
]>
<hr>人力資源标準</hr>
子元素
n 當一個元素隻包含子元素,而沒有字元資料時,則稱此元素類型具有元素内容(element content)。
n 在該類型的元素聲明時,通過内容模型來指定在其内容上的限制。内容模型是決定子元素類型和子元素出現順序的一種簡單文法。
n 利用括号、逗号、豎線、星号、加号、問号的組合,可以說明很複雜的内容模型。我們看下面的例子:
<!ELEMENT 履歷 (姓名,性别,年齡,(電話|手機),家庭住址?,興趣愛好*,教育經曆+,工作經驗*)>
這說明履歷中要有姓名,接下來是性别和年齡,電話和手機任選一個,可以填一個家庭 住址或者不填,然後是零個或多個興趣愛好,至少要有一個教育經曆,最後是零個或多個工作經驗。
混合内容
n 說明元素既可以包含字元資料,也可以包含子元素。
n 混合内容必須被定義零個或多個。
例如:
<?xml version="1.0" encoding="gb2312"?>
<!DOCTYPE employee[
<!ELEMENT employee (#PCDATA|name)*>
<!ELEMENT name (#PCDATA)>
]>
<employee>
<name>張三</name>
</employee>
n 在使用混合内容模型時,#PCDATA關鍵字必須是模型中的第一個選項,不能在模型中使用逗号、問号和加号。用豎線分隔的#PCDATA和元素的清單是合法的,其他用法都是不合法的。
EMPTY
n 關鍵字EMPTY表明該元素不包含字元資料,也不包含子元素,是一個空元素。
n 如果在文檔中元素本身已經表示了明确的含義,就可以在DTD中用關鍵字EMPTY來聲明空元素。例如:
<!ELEMENT br EMPTY>
表明br是一個沒有内容的空元素。
ANY
n 關鍵字ANY表明該元素可以包含任何的字元資料和子元素,隻要它們不違反XML格式良好的限制就可以了。例如:
<!ELEMENT employee ANY>
表明employee可以包含任何形式的内容。
n 在實際使用時,應該盡量避免使用ANY,一個定義明确的DTD,有助于我們清理文檔的結構,更好地了解文檔。
實體聲明
n 有兩種類型的實體:一般實體(general entity)和參數實體(parameter entity)
n 一般實體是在文檔内容中使用的實體,而參數實體則是在DTD中使用的已分析實體。
n 不管是一般實體,還是參數實體都是用ENTITY關鍵字來聲明。
一般實體和參數實體
n 一般實體的聲明文法如下:
<!ENTITY 實體名 “實體内容”>
引用實體的方式為:”&實體名;”。
n 參數實體隻能在DTD中使用,它的聲明文法如下:
<!ENTITY % 實體名 “實體内容”>
注意在聲明時,ENTITY、%和實體名之間各有一個空格。引用實體的方式為:“%實體 名;”
n 在内部DTD子集中,參數實體引用不能在标記聲明内部出現,可以在标記聲明允許出現的地方出現。對于外部DTD子集,則沒有這個限制。
n 在DTD中,所有的參數實體必須在引用之前進行聲明。這意味着内部DTD子集不能引用在外部DTD中聲明的參數實體,這是因為XML處理器将首先讀取内部子集,也就是說,内部子集中的實體和屬性清單聲明的優先級别要比在外部子集中的高。
n 内部實體在XML文檔内部定義,實體内容在聲明中給出。内部實體都是已分析的實體,它們沒有單獨的實體存儲對象。
n 外部實體在單獨的(外部)檔案中定義,外部實體可以是已分析實體,也可以是未分析實體。外部一般實體的聲明形式如下:
<!ENTITY copyright SYSTEM “http://localhost/copyright.xml”>
關鍵字SYSTEM表明這是一個私有的外部一般實體,後面的URI稱為該實體的系統标 識符,用于給出外部檔案的位置。
copyright.xml檔案的内容為:
<?xml version=”1.0” encoding=”gb2312”?>
©2004,程式員,All Rights Reserved
<?xml version=”1.0” encoding=”gb2312”>稱為文本聲明。文本聲明類似于XML聲明,不過文本聲明沒有standalone屬性,并且version屬性也是可選的。外部已分析實體可以使用不同UTF-8的編碼,使用文本聲明來指定實體内容的編碼方式。
n 每個外部已分析實體都應該以文本聲明開始。文本聲明隻能在外部已分析實體的開頭出現,不能出現在其他任何位置。在外部已分析實體中的文本聲明不會作為替換文本的一部分出現。
n 也可以使用PUBLIC關鍵字來聲明公共的外部一般實體,其聲明形式和使用了關鍵字PUBLIC的外部DTD聲明類似。如下:
<!ELEMENT open-hatch PUBLIC “-//Textuality//TEXT Standard open-hatch
boilerplate//EN” “http://www.textuality.com/boilerplate/.OpenHatch.xml”>
“-//Textuality//TEXT Standard open-hatch boilerplate//EN”稱為該實體的公共辨別符,後面 的URI部分為該實體的系統辨別符。
n 下面的例子聲明了一個外部一般未分析實體。
<!ELEMENT hatch-pic SYSTEM “../grafix/OpenHatch.gif” NDATA gif>
n 與一般實體類似,參數實體的替換文本也可以位于外部檔案中,其聲明形式和一般實體類似。