XML是W3C在1996年底提出的標準,是從SGML衍生出來的簡化格式,也是一種元語言(meta-language),可以用來定義任何一種新的標示語言。XML的制定是為了補HTML的不足,使得在Web上能夠傳輸、處理各類復雜的文件,它舍去了SGML復雜不常用及不利于在Web傳送的選項功能,讓使用者可以很容易地定義屬于自己的文件型態,程序設計師也能在更短的時間開發XML相關應用程序。XML1.0 Recommendation于1998年2月公布,相關標準目前仍在發展之中,XML的發展獲得了各界的支持,其中包括了Sun Microsystesms, Microsoft, Netscape, Adobe, ArborText...等軟件大廠。
XML的發展背景主要是因為HTML的諸多限制已經影響了Web的發展,XML的發展成員大都對SGML及結構化的信息(structured information)有相當豐富的應用經驗,他們相信引進SGML技術,能夠彌補HTML的不足,對Web的發展能有以下幾個方面的貢獻:
結構化信息的一個主要應用是資料交換,不同的領域可以針對領域的特性制定共同的信息內容模型(content model),并以這個共同的內容模型來標示信息,如此可以促使同領域的信息可以更容易且更有效率地交換,這個共同的內容模型,我們稱之為DTD。無疑地,Web是理想的電子數據交換的媒介,但HTML并非理想的數據交換格式,也難以充分地表現各種信息內容模型與語意結構,而XML所要提供的正是一套可以在Web上承載各種結構化信息的框架。
Java技術的出現使得瀏覽器能成為通用的應用系統平臺,但HTML固定的標簽集及不擅長描述語義的特性,使得Java程序沒有太大的發揮空間,而XML正好可以給予Java程序大顯身手的環境,以XML做為各種結構化信息的標準格式,搭配上Java程序,可以使得應用程序大部分的運算得以在客戶端執行,這和目前大部分的Web-based應用程序主要透過伺服端的CGI scripts來完成大部分的運算是相反的模式。借著XML與Java技術的結合,將應用程序的運算從伺服端移到客戶端來,有助于降低網絡的流量與增加網絡的速度。
HTML與XML的始祖SGML提供了一套能夠指定信息的結構與語義的語法規則,而且具備了平臺獨立性。不像Microsoft的RTF、Adobe的PostScript以及其它專屬性的文件格式,SGML所提供的是一套具備平臺獨立性與系統獨立性的語法規則。
XML文件有兩種型式,一種稱為Well-formed XML,另一種稱為Valid XML,兩者最大的差異為是否有DTD。Well-formed XML能夠讓使用者在Web上跨越HTML只有固定標簽集(tag set)的限制,自行定義所需要的標簽。Well-formed XML不像SGML與Valid XML一般,要使用自行定義的標簽必須先在DTD中以嚴謹的語法進行宣告,而是可以直接使用。能夠依據應用程序開發的需要自行定義標簽,使得Web文件的處理與設計上有更大的彈性與更好的控制。
Well-formedness是XML所提出來的新概念,一份Well-formed XML文件可以很容易被計算機所讀取,并在網絡上傳送。Well-formed文件必須遵守以下幾條規則:
包含一個以上的元素(elements)。
恰有一個根元素(root),不出現在其它元素的內容之中。
所有的元素都有起始卷標與結束卷標,也就是卷標必須成對。
所有的標簽必須呈現適當的巢狀(nest)結構。
空卷標(empty tags)必須遵守特殊的XML語法。(如<empty/>)
所有的屬性值都必須括上單引號或雙引號。
所有的實體(entity)都必須宣告。
XML宣告的目的是讓人在閱讀時或機器在解譯時能識別這是一份XML文件,尤其避免與SGML文件與HTML文件混淆。XML宣告包含了標示語言(markup language)、標示語言版本、是否呼叫外部文件及字集編碼(character encoding)等信息。以下是幾個Well-formed XML文件的宣告實例,第1個實例是所有的Well-formed XML文件所使用宣告;第2個實例只是第1個實例的簡略寫法;第3、第4個實例則指明了文件所采用的字集編碼標準。
|
XML 宣 告 實 例 |
1 |
<?xml version=”1.0” standalone=”yes”?> |
2 |
<?xml version=”1.0”?> |
3 |
<?xml version=”1.0” encoding=”UTF-8”?> |
4 |
<?xml version=”1.0” encoding=”big5”?> |
下表列出了XML宣告的語法符號及保留字所代表的意義:
|
說 明 |
<? |
XML宣告的起始字符。 |
xml |
表示這是一份XML文件。 |
version |
用來指定XML的版本,默認值是 “1.0”。 |
standalone |
用來表示該文件是否呼叫其它外部的文件。若值是 ”yes” 表示沒有呼叫外部文件,若值是 ”no” 則表示有呼叫外部文件。
默認值是 “yes”。 |
encoding |
指定文件所使用的字集編碼,默認值是 “UTF-8”。 |
?> |
XML宣告的結束字符。 |
每一份XML文件都以一個根元素來包含所有其它的元素,以電子郵件為例,其文件結構樹形圖如下:
Email是根元素,包含了From, Date, To, Body, Attachment等子元素。通常根元素的命名被用來代表文件的類型。大家所熟悉的HTML文件,其根元素就被命名為html。
一份Well-formed XML文件應該有如下的型式:
<?xml version=”1.0” standalone=”yes”?>
<Email>
……
</Email> |
根據文件的類型訂定根元素之后,接著就可以開始標示文件的內容,雖然Well-formed XML的元素不需透過DTD來宣告,不過在開始標示文件之前,最好還是先畫出文件結構的樹形圖,亦即元素間的關系圖。在元素的命名方面盡量使用有意義、易于理解的名稱,以增加文件的可讀性。
下面是一份已標示的Well-formed XML文件實例,所使用的卷標名稱很容易看出所代表的意義。
<?xml version=”1.0” standalone=”yes”?>
<Email>
<From>Joe</From>
<Date>1999-4-29 AM 01:50</Date>
<To>Jay</To>
<To>Jennifer</To>
<To>Joann</To>
<Subject>Brief introduction to myself</Subject>
<Body>Dear all, I am Joe. I ’m a graduate student majored in Library
and Information Science from Fu-Jen University….</Body>
</Email> |
完成文件的標示工作之后,接下來就是檢查這份XML文件是否符合Well-formed XML的語法規則。以人工逐行檢查是一種方法,不過太沒有效率,也容易有所疏漏。檢查XML文件是否具備Well-formedness的最好方法是利用XML剖析器(parser),它可以檢查出XML文件的語法錯誤。目前在網絡上有各種免費的XML parser可以下載,Micorsoft Internet Explorer 5.0瀏覽器內建了一個XML剖析器,圖1與圖2分別是以其來瀏覽一份正確與一份有語法錯誤的XML文件所得到的結果。事實上XML文件必須搭配樣式表(style sheet)才能呈現,Micorsoft Internet Explorer 5.0瀏覽器能夠呈現純粹的XML文件,是因為內建了XML的預設樣式。
圖1:一份正確的Well-formed XML文件在Microsoft Internet Explorer 5.0 的瀏覽結果
圖2:一份有語法錯誤的XML文件在Microsoft Internet Explorer 5.0 的瀏覽結果
Valid XML文件所參照的DTD可以放在文件內部,也可以是另一份外部文件。DTD如果放在文件內部,所使用的XML宣告如下:
<?xml version=”1.0” standalone=”yes”?>
DTD如果是另一份外部文件,則所使用的XML宣告如下:
<?xml version=”1.0” standalone=”no”?>
采用Email為例子來設計其DTD,下面是電子郵件的XML DTD。
<!-- DTD for Email -->
<!-- Elements Content -->
<!-- ---------- --------- -->
<!ELEMENT Email (From,Date,To*,Subject,Body?,Attchment?)>
<!ELEMENT From (#PCDATA)>
<!ELEMENT Date (#PCDATA)>
<!ELEMENT To (#PCDATA)>
<!ELEMENT Subject (#PCDATA)>
<!ELEMENT Body (#PCDATA)>
<!ELEMENT Attachment (#PCDATA)>
<!-- End of DTD --> |
XML文件的結構定義在DTD之中,DTD通常包含了元素宣告與屬性宣告:
一、元素(Element)宣告:
XML文件的語意結構是透過DTD的元素宣告來定義,電子郵件的文件結構在DTD中以下面的元素宣告來表示:
<!ELEMENT Email (From,Date,To+,Subject,Body?,Attchment?)>
下表是上述元素宣告的語法說明:
語 法 |
說 明 |
<! |
宣告的起始符號。 |
ELEMEMT |
元素宣告的保留字。 |
Email |
元素的名稱。 |
(From,Date,To+,Subject,Body?,Attchment?) |
元素Email的內容,以內容模式(content model)來表達,此例的意義為:元素Email依序包含了 From, Date, To, Subject, Body, Attchment 等子元素,其中To至少有一個,Body與Attachment則可以沒有或有一個以上。 |
> |
宣告的結束符號。 |
元素的內容模式(content model),除了定義所包含的子元素外,也定義每個子元素可出現的次數及出現的順序關系。內容模式的語法如下表:
語 法 |
說 明 |
( |
內容模式定義的起始符號。 |
, |
Sequence connector;表示出現的順序。 |
& |
And connector;必須同時出現,但沒有先后次序的限制。 |
| |
Or connector;必須有一者出現,但不能同時出現。 |
* |
optional and repeatable;不出現或出現一次以上。 |
? |
optional occurrence;不出現或只出現一次。 |
+ |
required and repeatable;至少出現一次。 |
) |
內容模式定義的結束符號。 |
如果元素的內容并沒有包含任何子元素,只有包含純粹的文字數據,其元素內容以 #PCDATA來表示,如下面的元素宣告:
<!ELEMENT From (#PCDATA)>
二、屬性(Attribute)宣告:
每個元素可以有一個以上的選擇性或強制性的屬性,用來描述元素的某種特性。屬性必須在起始卷標中指定,而所有可能的值及默認值則在DTD中定義。如下例:
<!ATTLIST To …..
group (coworkers | family | friends) “coworkers”>
上述屬性宣告的語法說明如下表:
語 法 |
說 明 |
<! |
宣告的起始符號。 |
ATTLIST |
屬性宣告的保留字。 |
To |
欲宣告屬性的元素名稱。 |
group |
屬性的名稱 |
(coworkers | family | friends) |
列舉出屬性所有可能的值。(coworkers | family | friends)表示屬性 group 可能的值是 “coworkers”, “family”, “friends”。 |
“coworkers” |
屬性的默認值。 |
> |
宣告的結束符號。 |
如果Element沒有對應的Attirbute敘述,表示該Element不具有任何屬性。
(一) 撰寫Valid XML文件實例:
利用前述的XML DTD就可以寫一份電子郵件的Valid XML文件,下面是一份引用外部DTD的Valid XML文件
<?xml version=”1.0” encoding=”big5” standalone=”no”?>
<!DOCTYPE Email SYSTEM "C:\xml\email.dtd">
<Email>
<From>Joe</From>
<Date>1999-4-29 AM 01:50</Date>
<To>Jay</To>
<To>Jennifer</To>
<To>Joann</To>
<Subject>Brief introduction to myself</Subject>
<Body>Dear all, I am Joe….. </Body>
</Email> |
以下則是一份引用內部DTD的Valid XML文件。
<?xml version=”1.0” encoding=”big5” standalone=”yes”?>
<!DOCTYPE Email [
<!ELEMENT Email (From, Date, To*, Body?, Attchment?)>
<!ELEMENT From (#PCDATA)>
<!ELEMENT Date (#PCDATA)>
<!ELEMENT To (#PCDATA)>
<!ELEMENT Subject (#PCDATA)>
<!ELEMENT Body (#PCDATA)>
<!ELEMENT Attachment (#PCDATA)>
]>
<Email>
<From>Joe</From>
<Date>1999-4-29 AM 01:50</Date>
<To>Jay</To>
<To>Jennifer</To>
<To>Joann</To>
<Subject>Brief introduction to myself</Subject>
<Body>Dear all, I am Joe….. </Body>
</Email> |
(二) 剖析(parse)Valid XML文件:
所有的XML文件都必須符合Well-formedness,包括Well-formed XML文件與Valid XML文件。因此完成Valid XML文件的標示工作之后,接著要做的是先檢查這份XML文件是否符合Well-formed XML的語法規則,在前面我們已經介紹過檢查的方法了。Valid XML除了必須符合Well-formedness外,也需符合DTD所定義的文件結構。XML的剖析器(parser)分為兩類,一種稱為非確認性(non-validating)剖析器,只能檢查XML文件是否符合Well-formedness規則,無法依據DTD進行文件結構的確認,像Micorsoft Internet Explorer 5瀏覽器中所包含的XML剖析器就是一個非確認性(non-validating)剖析器,因此只要所瀏覽的XML文件符合了Well-formedness規則,就算文件的標示與DTD的結構不符,它也不會發現任何錯誤。另一類剖析器稱謂可確認性(validating)剖析器,它除了檢查XML文件是否符合Well-formedness規則,也可以依據DTD進行文件結構的確認。
利用最簡單的文字編輯器(text editor)即可撰寫XML文件,不過每一對起始卷標與結尾卷標都必須自行鍵入。撰寫XML文件較便利的方法是利用專門的XML編輯器,它可以讓你定義元素名稱、屬性名稱或實體名稱,在編輯XML文件時,它以一個清楚易讀的編排格式,讓你能更容易地輸入XML宣告、樣式表類別與路徑、DTD的路徑及每個元素、屬性的值,幫你產生起始卷標與結尾卷標。
不同的XML編輯器功能不一,除了最基本編輯的功能外,有的只能檢查是
否符合Well-formedness,而不能依據DTD來作文件結構的確認;有的則可依據DTD來作文件結構的確認;在中文碼的支持方面,有的可以全面支持Big5中文碼,有的只有XML文件的內容部分才可以使用Big5中文碼,有的則完全不支持Big5中文碼。
下圖是Microsoft公司的產品XML Notepad Beta 1.5,它只允許元素的內容使用Big5中文碼,標簽與批注的部分都不支持Big5,這個版本也不支持以DTD來進行文件結構的確認。
大部分的人都聽過HTML,透過XML與HTML的比較來原本就熟悉HTML的人來說,是學習XML的好方法。XML與HTML是不同層級的標示技術,HTML是一種特定的標示語言,包含了一組標準的元素集(element set),元素用來指示特定的文字片段在文件中所扮演的角色,每一個元素都有標準的意義。例如:<H1>與</H1>在HTML文件中的意義是最重要的標題(heading)。除了HTML之外,還有很多種特定的標示語言,例如航空產業針對飛行器維護手冊制定了一個標示語言稱為ATA-2100,半導體產業針對電路數據制定了一個標示語言稱為PCIS,計算機產業針對軟件文件訂了一個標示語言稱為DocBook。這些特定的標示語言都有以下共同點:
●都定義了一組標簽集(tag set),每個標簽都有標準的意義及標準的使用規則,也就是有標準的文法(grammer)。
●都是為了某類型的文件或數據專門設計的。
●都使用文字處理(text processing)國際標準SGML來定義它們的標簽集與文法。
XML繼承了SGML的可擴展性(extensibility)、結構性(structure)與可確認性(validation),這三點也是XML與HTML在特性上最重要的不同,說明如下:
|
HTML |
XML |
可擴展性(extensibility) |
卷標集與每個卷標的意義是固定的,使用者無法自行定義卷標(tags)或屬性(attribute)。 |
允許使用者根據需要,自行定義卷標與屬性,以便更進一步描述數據的語意。 |
結構性(structure) |
不支持深層的結構描述。 |
能描述各種復雜的文件結構,如數據庫綱要 (schema)及對象導向的階層結構。 |
可確認性(validation) |
沒有提供語法規格來支持應用程序對HTML文件進行結構確認。 |
可包含一個語法規格 (DTD),讓應用程序對文件進行結構確認。 |
XML文件每一個起始標簽都要有對應的結束卷標,成對的起始卷標與結束卷標就稱為元素。每一元素都必須巢狀包覆(nested within)在另一個元素之內。例如:
<LI>HTML allows <B><I>improper nesting</B></I>
上面是一段HTML原始碼,但B、I并沒有巢狀包覆的關系,且LI沒有結束標簽,所以不符合XML的語法規則。
<LI>XML required <B><I>proper nesting</I></B>
上面這個例子則符合XML的語法規則,I巢狀包覆在B之內,且每一個元素都有成對的起始卷標與結束卷標。
和HTML一樣,XML也允許元素是空元素,所謂空元素的意思是元素的起始卷標與結束卷標是同一個。XML對于空元素的表示方法和HTML不同,必須在元素型別名稱之后加上斜線(slash)。例如:下面這一段HTML原始碼中,<BR>是一個空元素。
<LI>This is a HTML <BR>empty tag.</LI>
以XML的語法規則,必須表示如下:
<LI> This is a XML <BR/>empty tag.</LI>
XML這樣規定的目的是使XML處理器(processor)讀到 “/>” 便知道這是一個空元素,就不用再往下找結束標簽了。在HTML中,HTML處理器之所以知道 <BR> 是一個空元素,是因為HTML的標簽集是預先定義好的;而XML允許使用者自行定義標簽,因此必須有特殊的語法來表示空元素,XML處理器才不至于搞混。
HTML除了包含空白的屬性值必須以引號夾住外,其余的情況可以省略引號;而XML所有的屬性值(attribute value)都必須以引號(quotes)夾住。例如:
<FONT color=#FF0000>HTML attribute value</FONT>
以上是一段合法的HTML原始碼,屬性值沒有用引號夾住,不符合XML的語法規則。
<FONT color=”#FF0000”>XML attribute value</FONT>
上面這個例子符合XML的語法規則,屬性值必須用單引號或雙引號夾住。
HTML卷標大小寫是一樣的,XML標簽大小寫則有區別。例如:
<H1>HTML is not case-sensitive, XML is.</h1>
以上是一段合法的HTML原始碼,在HTML中,H1與h1是相同的標簽;但在XML中,H1與h1則是不同的標簽。上面的HTML原始碼若以XML的語法來寫,就得寫成
<H1>HTML is not case-sensitive, XML is.</H1>
HTML除了PRE元素內的連續空白有效外,其余的連續空白都會被視為只有一個空格符。HTML的空白包括了ASCII space( )、ASCII tab(	)、ASCII form feed()、Zero-width space(​)以及 Line breaks,這里的 &#x 表示Unicode的十六進制。而由于XML主要是用來裝載數據,因此在XML卷標之間的空白都是有效的,但在卷標本身及屬性值的引號之間的空白是無效的。例如:
(1)<desc lan=”English”>XML white space handling</desc>
(2)<desc lan=”English”>XML white space handling</desc>
(3)<desc lan=”English”>XML white space handling</desc>
以上三段XML原始碼,(1)與(2)是相同的,但(3)與(1)(2)則不同。
這個限制使得XML剖析器較容易確認文件已經結束了。
XML的字集編碼是在<?xml?>宣告中指定,例如:
<?xml version=”1.0” encoding=”UTF-8”>
上面的例子表示這份XML文件以UTF-8編碼。所有符合XML規格的軟件工具一定都支持ISO 10646字集,ISO 10646是一組龐大的字集,其中包含了Big5中文碼及GB2312中文碼中所有的字。ISO 10646包含了幾種編碼方式:UTF-8是8 bit的,UTF-16是16-bit的,Unicode就是UTF-16的形式。
有一些字符本身就是XML語法結構的一部份,若要在XML文件中使用這些字符必須使用替代的表示法,XML使用預先定義的實體(predefined entity)來替代這些字符,如下表:
Reserved character |
Predefined entity to use instead |
< |
< |
> |
> |
& |
& |
“ |
" |
‘ |
' |
上表中前四個字符在HTML中也使用同樣的替代表示法,在HTML中稱為字符實體參引(character entity references)。
2.如何將HTML文件轉換成Well-formed XML文件:
要將現有的HTML文件轉換成XML文件,首先要先使文件具備Well-formedness,除了要在文件的開頭加上XML宣告外(<?xml version=”1.0”?>),可以依循下列四個轉換步驟。
HTML的起始卷標與結束卷標在使用上,有時會被當作切換(switch on and off)的工具,其實這是不好的觀念,這會使得標簽出現交錯的情況,例如下面不是一段合法的XML code,因為標簽有交錯的情況。
<b><i>bold italic font</b>italic font</i>
必須修改成有適當的巢狀結構才符合XML的語法,如下:
<b><i>bold italic font</i></b><i>italic font</i>
SGML允許省略標簽,只要在DTD中宣告該元素的卷標可以省略即可。在HTML 4.0 DTD中,許多標簽都是允許省略的,如元素 p, ul, …的結束卷標,甚至連元素 html, body 的起始與結尾標簽都可以省略。要將HTML文件轉成XML文件,必須將所有省略的標簽都補上。
在HTML中,屬性值的引號有時會省略,特別是數字型態的屬性值,在XML文件中任何型態的屬性值都必須加上單引號或雙引號。在HTML中,如果屬性只有一種可能的值,甚至可能省略屬性的名稱,直接寫入屬性值。如 <ul compact>,在XML中必須寫成 <ul compact=”compact”>。
XML對于空元素的表示有特別的格式,如下面是一段HTML原始碼:
<IMG ALIGN=”RIGHT SRC=”sample.gif”>
在XML中必須表示如下:
<IMG ALIGN=”RIGHT SRC=”sample.gif”/>
W3C XML Resource http://www.w3.org/XML/
Robin Cover, The XML Cover Pages http://www.oasis-open.org/cover/
XML.com http://www.xml.com/
Microsoft XML Resource http://msdn.microsoft.com/xml/
IBM XML Resource http://www.ibm.com/developer/xml/
中研院電算中心 Chinese XML http://www.ascc.net/xml/