1.DTD - XML 建立主組件羣(blocks)
像<body>....</body>之類的標籤是XML和HTML文件的主組件羣(blocks)。
1.1XML文件的組件羣
從DTD來看,所有的XML文件(和HTML文件)都是由接下來的簡單組件羣組成的:Elements元素;Attributes 屬性;Entities實體;PCDATA 被解析的字符數據(Parsed Character Data);CDATA 字符數據值(Character Data)。下面是每個組件羣的簡短解釋。
1.2元素(Elements)
元素是XML和HTML文件的主組件羣(main building blocks)。HTML元素的實例是"body" 和"table"。XML元素實例是"note" 和"message"。元素可以包括文本、其它元素或者空值。空值html元素的實例是"hr", "br" 和"img"。
例如:
<body>body text in between</body>
<message>some message in between</message>
1.3屬性(Attributes)
屬性提供關於元素的額外信息(extra information about elements)。屬性總是置於元素的開始標籤裏面。屬性一般是以“名稱(name)/值(value)”這樣的形勢一對對的出現。下面的“img”元素就是關於源文件的補充信息:
<img src="computer.gif" />
元素名稱是“img”。屬性名稱“src”。屬性值是"computer.gif"。因爲元素自身是空值,所以它是以“/”結束的。
1.4實體(Entities)
實體是對於定義普通文件(define common text)的變量。實體參數是定義實體的參數。很多人都知道HTML實體參數:" "。這裏的"no-breaking-space"實體是在HTML中用來在文本中插入一個額外空間的。當XML剖析器解析文件時,實體就會得到擴展。下面(表1)的實體是在XML中預定的:
表 1 |
|
字符 |
字符實體 |
& |
&或& |
' |
'或' |
> |
>或> |
< |
<或< |
" |
"或" |
1.5 PCDATA
PCDATA的意思是被解析的字符數據。把字符數據當作XML元素的開始標籤與結束標籤之間的文本。剖析器會分析PCDATA文本。文本中的標籤會被當作標示的字體,實體將會擴展。
1.6 CDATA
CDATA也是字符數據的意思。剖析器不會解析CDATA文本。文本中的標籤不會作爲標示字體,實體也將不會得到擴展。
2.元素定義
2.1元素聲明
元素聲明語法如下:
<!ELEMENT name content>
其中,name是一個標準的XML標記的名字。Centent由以下三種之一組成:
①關鍵字EMPTY;
②關鍵字ANY;
③描述包含在本元素中的子元素的順序和重複次數的內容模型。
2.2元素內容類型(Element Content Model)
元素內容通常有五種類型:EMPTY、ANY、#PCDATA、子元素型和混合型。
2.2.1 EMPTY類型
EMPTY用於定義空元素,該元素只可能有屬性而不會有字符數據或子元素。其形式爲<swt/>或<swt></swt>。聲明空元素的語法如下:
<!ELEMENT emptyelement EMPTY>
2.2.2 ANY類型
該元素可以包含DTD中定義的其他任何元素或已編譯的字符數據。聲明該元素的語法如下:
<!ELEMENT anyelement ANY>
2.2.3 #PCDATA類型
不包含其它任何元素而只包含字符數據的元素,用關鍵字#PCDATA進行定義,它代表“已編譯的字符數據(parsed character data)”。PCDATA可以包含除標記以外的一切字符,包括數字、字母和符號等。被定義爲包含PCDATA的元素不能包含任何其它子元素。示例如下:
<!ELEMENT title(#PCDATA)>
2.2.4 子元素類型
元素可以包含一系列的子元素,子元素內容模型用於指定某個元素可以包含哪些子元素,如:
<!ELEMENT message(header,body,signature,footer)>//message元素包含四個子元素,依次是header、body、signature和footer元素。
根據子元素間的關係,子元素內容模型可以有兩種可能的結構:序列和選擇。
①序列。其所有子元素必須出現且僅出現一次,這種結果成爲序列。使用序列時應注意,首先,序列中不能出現#PCDATA;其次,子元素自身還可以包含其它子元素。
②選擇。元素間的選擇可以進行如下聲明:
<!ELEMENT elem(subelem1|subelem2|subelem3)>//將子元素用豎線進行分隔,表明elem元素的子元素爲subelem1、subelem2和subelem3三者之一,但不能同時包含其中的兩個或三個子元素。
序列和選擇這兩種結構可以結合使用。
2.2.5 混合類型
若某元素既包含子元素又包含已編譯的字符數據,則該元素具有混合內容。其聲明如下:
<!ELEMENT pick(#PCDATA|one|two|three)*>
爲避免產生錯誤,混合內容元素的聲明必須遵循這一格式。即採用單一的一組可選項,以#PCDATA開始,後面是混合內容中可能出現的子元素類型,每種只需聲明一次。除此之外,“*”必須放在右括號之後。下面的聲明是錯誤的:
<!ELEMENT pick(one|#PCDATA|two*|three)>
2.3元素出現次數指示符(Element Occurrence Indicator)見表2
表 2 |
|
符號 |
代表標記出現的次數 |
? |
不出現或只出現一次 |
* |
不出現或可出現多次 |
+ |
必須出現一次以上 |
無符號 |
只能出現一次 |
3.屬性定義
3.1屬性聲明
屬性聲明的語法如下:
<!ATTLIST Element_name Attribute_name Type Defualt_value>
其中,ATTLIST關鍵字用來定義元素所具有的屬性,Element_name是元素名,Attribute_name是該元素所具有的屬性名,Type是屬性的類型,Defualt_value是屬性的默認值。注意:在一個給定的元素中不能有兩個屬性同名;若屬性值中含有雙撇號,則該屬性值應用單撇號括起來。如:
<job comments=’He said,”I can paint only red door” ’>Door Painter</job>
3.2 屬性類型
在XML中共有10種屬性類型(attribute-type):(見表3)
表 3 |
|
屬性值類別 |
描述 |
CDATA |
屬性值僅僅是一般的文字。與#PCDATA元素聲明類似。 <!ATTLIST AnElem attr CDATA #REQUIRED> |
Enumerated |
列出該屬性的取值範圍,一次只能有一個屬性值能夠賦予屬性。 <!ATTLIST play position (center|forward|defense) ”center”> |
NMTOKEN |
表示屬性值只能由字母或下劃線_開始,之後是字母、數字、下劃線、短橫線或圓點,且不能含有空格。 |
NMTOKENS |
表示屬性值能夠由多個nmtoken組成,每個nmtoken之間用空格隔開。 |
ID |
ID類型用於標識文檔中的元素。該屬性在xml文件中是唯一的。同時,每個元素最多隻能具有一個ID類型的屬性。 <!ALLTIST author authorID ID #REQUIRED > |
IDREF/ IDREFS |
IDREF表示該屬性值是參考了另一個id屬性;IDREFS表示該屬性值是參考了多個id屬性,這些id屬性的值用空格隔開。 DTD定義: <!ELEMENT bookInfo(publishers,authors,books)> <!ELEMENT publishers(publisher+)> <!ELEMENT publisher(pname,address)> <!ATTLIST publisher publisherID ID #REQUIRED> <!ELEMENT pname(#PCDATA)> <!ELEMENT address(#PCDATA)> <!ELEMENT authors(author+)> <!ELEMENT author(aname,age,sex)> <!ATTLIST author authorID ID #REQUIRED> <!ELEMENT aname(#PCDATA)> <!ELEMENT age(#PCDATA)> <!ELEMENT sex(#PCDATA)> <!ELEMENT books(book*)> <!ELEMENT book(title,price,year)> <!ATTLIST book publisher IDREF #REQUIRED author IDREFS #REQUIRED> <!ELEMENT title(#PCDATA)> <!ELEMENT price(#PCDATA)> <!ELEMENT year(#PCDATA)> 對應的XML文檔: <bookInfo> <publishers> <publisher publisherID=”p001”> <pname>tsinghua university press</pname> <address>Beijing</address> </publisher> <publisher publisherID=”p002”> <pname>electronic industy press</pname> <address>Beijing</address> </publisher> </publishers> <authors> <author authorID=”a001”> <aname>Mary</aname> <age>34</age> <sex>male</sex> </author> <author authored=”a002”> <aname>Tom</aname> <age>39</age> <sex>female</sex> </author> </authors> <books> <book publisher=”p001” author=”a001 a002”> <title>XML</title> <price>22</price> <year>2007</year> </book> </books> </bookInfo> |
ENTITY |
表示該屬性的設定值是一個外部實體(entity),如一個圖片文件。 |
ENTITYS |
該屬性值包含了多個外部entity,不同的entity之間用空格隔開。 |
NOTATION |
屬性值是在DTD中聲明過的notation(聲明用什麼應用軟件解讀某些二進制文件,如圖片)。 <!NOTATION gif SYSTEM “GIF_Viewer”> <!NOTATION jpg SYSTEM “JPG_Viewer”> <!NOTATION png SYSTEM “PNG_Viewer”> <!ELEMENT img (#PCDATA)> <!ATTLIST img src CDATA #REQUIRED NOTATION(png|jpg|gif)#REQUIRED > //其中,type屬性的值可以爲png、jpg和gif之一,且每個值均與一個相應的<!NOTATION>聲明相對應。 |
3.3 屬性默認值
屬性聲明可以給屬性指定一個默認值,使得當在XML文檔中未明確地指定該屬性的值時,XML處理器會將此默認值作爲該屬性的值。屬性的默認值可用#REQUIRED、#IMPLIED、#FIXED和字符串定義,見表4。
表4 |
|
屬性內定值 |
描述 |
#REQUIRED |
表示在標記中必須出現此屬性。 |
#IMPLIED |
標記中可以不出現此屬性。即該屬性不是必須使用。 |
#FIXED |
屬性的值是固定的某個值。 |
字符串 |
標記中如沒有指定屬性的值,那麼此字符串就是此屬性的值。 |