[鼠年全馬鐵人挑戰]Week01-重新認識XML(1)-追溯源頭了解什麼是DTD

Nina Weng
4 min readFeb 14, 2020

--

在寫專案的時候,常常看到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;&copyright;</author>

其中要特別注意的是在XML使用的時候,語法為:

&實體名稱;

開頭的 & 和結尾的 ; 都不能漏掉哦!

DTD的介紹先到這邊,下一篇會講XSD!

#w3HexSchool #XML #DTD

--

--

Nina Weng
Nina Weng

Written by Nina Weng

一個技能雜亂點的菜鳥工程師。因為實在太菜,有太多東西要學而不知所措。與其把時間花在猶豫不決不知從何開始,不如先開始,然後再漸漸深入專研某一項技能吧!

No responses yet