在寫專案的時候,常常看到config檔或一些API文件會寫到 xmlns、xsi或xsd,例如:NLog.config:
<?xml version=”1.0" encoding=”utf-8" ?>
<nlog xmlns=”http://www.nlog-project.org/schemas/NLog.xsd"
xmlns:xsi=”http://www.w3.org/2001/XMLSchema-instance">
</nlog>
過去被專案的時程追趕著,一直沒有認真花時間搞懂這些,想說之後有時間再來搞懂。我想,現在就是那個之後有時間了吧 😅!要追溯XML的歷史,首先就要先了解什麼是Document Type Definition(DTD)。
DTD (文件類型定義),可以把它看作成事先定義XML結構的模板。可以想像一下,我們平常可以自由的定義XML的的文字格式,拿常見的HTML來舉例:
<table border="1">
<tr>
<td>這裡可以放表格內容</td>
</tr>
</table>
XML要怎麼知道 <table>...</table>
是什麼呢?就是透過DTD事先定義好我們自定義的模板!DTD由幾個元件所組成,像上面Table範例的DTD如下:
<?xml version="1.0" ?>
<!DOCTYPE table[
<!ELEMENT table (tr)>
<!ELEMENT tr (#PCDATA)>
<!ELEMENT tr (td)>
<!ELEMENT td (#PCDATA)>
]><table border="1">
<tr>
<td>這裡可以放表格內容</td>
</tr>
</table>
接下來就來介紹幾個組成DTD的元件:
DTD的組成元件
元素(Element)
元素是構成XML最重要的元件,其定義語法如下:
<!ELEMENT 元素名稱 類別>
像是上文範例中的 td
就是一個元素,我們定義它的類別為 #PCDATA
。
PCDATA( Parsed Character Data)類別,如字面上的意思一樣,代表這個字元資料已被解析。記得在宣告的時候,不要漏掉左右兩邊的小括號哦!
另外,除了PCDATA以外,還有EMPTY和ANY兩個關鍵字可使用。
倘若這個元素為空元素,則定義語法如下:
<!ELEMENT 元素名稱 EMPTY>
像是HTML常用的換行 <br />
就是一個空元素。
而關鍵字 ANY
則代表任何可解析資料的組合,其語法如下:
<!ELEMENT 元素名稱 ANY>
除了上述的定義外,元素也可以擁有子元素,語法如下:
<!ELEMENT 元素名稱 (子元素名稱1, 子元素名稱2, 子元素名稱3, ....)>
注意:一個XML只能有一個根元素
屬性(Attribute)
屬性顧名思義就是要來輔助元素,幫元素宣告它的屬性定義。
<!ATTLIST 元素名稱 屬性名稱 屬性類型 預設值>
一樣拿上面的例子來說, <table border="1">...</table>
這裡的 border
就是一個定義在 table
元素底下的屬性,其語法可以寫成下面這樣:
<!ATTLIST table border CDATA "0">
上述的 CDATA
為一種屬性類型,其英文全名為 Character Data,是不會被解析的文本。而 "0"
則意思是這個 border
的屬性預設值為 0。
實體(Entities)
實體就是事先先定義好某個實體固定等於某個值,類似常數的概念。其語法如下:
<!ENTITY 實體名稱 "實體的值">
舉個例子:
<!ENTITY writer “Nina”>
<!ENTITY copyright “Copyright Nina.”>
然後再XML就可以使用實體名稱來代表實體的值
<author>&writer;©right;</author>
其中要特別注意的是在XML使用的時候,語法為:
&實體名稱;
開頭的 &
和結尾的 ;
都不能漏掉哦!
DTD的介紹先到這邊,下一篇會講XSD!
#w3HexSchool #XML #DTD