第一章 XML的發展背景

    XMLW3C1996年底提出的標準,是從SGML衍生出來的簡化格式,也是一種元語言(meta-language),可以用來定義任何一種新的標示語言。XML的制定是為了補HTML的不足,使得在Web上能夠傳輸、處理各類復雜的文件,它舍去了SGML復雜不常用及不利于在Web傳送的選項功能,讓使用者可以很容易地定義屬于自己的文件型態,程序設計師也能在更短的時間開發XML相關應用程序。XML1.0 Recommendation19982月公布,相關標準目前仍在發展之中,XML的發展獲得了各界的支持,其中包括了Sun Microsystesms, Microsoft, Netscape, Adobe, ArborText...等軟件大廠。

XML的發展背景主要是因為HTML的諸多限制已經影響了Web的發展,XML的發展成員大都對SGML及結構化的信息(structured information)有相當豐富的應用經驗,他們相信引進SGML技術,能夠彌補HTML的不足,對Web的發展能有以下幾個方面的貢獻:

1.電子數據交換(EDI):

結構化信息的一個主要應用是資料交換,不同的領域可以針對領域的特性制定共同的信息內容模型(content model),并以這個共同的內容模型來標示信息,如此可以促使同領域的信息可以更容易且更有效率地交換,這個共同的內容模型,我們稱之為DTD。無疑地,Web是理想的電子數據交換的媒介,但HTML并非理想的數據交換格式,也難以充分地表現各種信息內容模型與語意結構,而XML所要提供的正是一套可以在Web上承載各種結構化信息的框架。

2.Java技術更緊密結合:

Java技術的出現使得瀏覽器能成為通用的應用系統平臺,但HTML固定的標簽集及不擅長描述語義的特性,使得Java程序沒有太大的發揮空間,而XML正好可以給予Java程序大顯身手的環境,以XML做為各種結構化信息的標準格式,搭配上Java程序,可以使得應用程序大部分的運算得以在客戶端執行,這和目前大部分的Web-based應用程序主要透過伺服端的CGI scripts來完成大部分的運算是相反的模式。借著XMLJava技術的結合,將應用程序的運算從伺服端移到客戶端來,有助于降低網絡的流量與增加網絡的速度。

3.攜帶平臺獨立(platform-independent)信息:

    HTMLXML的始祖SGML提供了一套能夠指定信息的結構與語義的語法規則,而且具備了平臺獨立性。不像MicrosoftRTFAdobePostScript以及其它專屬性的文件格式,SGML所提供的是一套具備平臺獨立性與系統獨立性的語法規則。

第二章 Well-formed XML Valid XML

 XML文件有兩種型式,一種稱為Well-formed XML,另一種稱為Valid XML,兩者最大的差異為是否有DTDWell-formed XML能夠讓使用者在Web上跨越HTML只有固定標簽集(tag set)的限制,自行定義所需要的標簽。Well-formed XML不像SGMLValid XML一般,要使用自行定義的標簽必須先在DTD中以嚴謹的語法進行宣告,而是可以直接使用。能夠依據應用程序開發的需要自行定義標簽,使得Web文件的處理與設計上有更大的彈性與更好的控制。

 Well-formednessXML所提出來的新概念,一份Well-formed XML文件可以很容易被計算機所讀取,并在網絡上傳送。Well-formed文件必須遵守以下幾條規則:

包含一個以上的元素(elements)。

恰有一個根元素(root),不出現在其它元素的內容之中。

所有的元素都有起始卷標與結束卷標,也就是卷標必須成對。

所有的標簽必須呈現適當的巢狀(nest)結構。

空卷標(empty tags)必須遵守特殊的XML語法。(如<empty/>

所有的屬性值都必須括上單引號或雙引號。

所有的實體(entity)都必須宣告。

1.撰寫Well-formed XML文件的步驟:

1.1.撰寫XML宣告(XML declaration

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宣告的結束字符。

1.2.訂定一個根元素(root element):

    每一份XML文件都以一個根元素來包含所有其它的元素,以電子郵件為例,其文件結構樹形圖如下:

    Email是根元素,包含了From, Date, To, Body, Attachment等子元素。通常根元素的命名被用來代表文件的類型。大家所熟悉的HTML文件,其根元素就被命名為html

    一份Well-formed XML文件應該有如下的型式:

<?xml version=1.0 standalone=yes?>

<Email>

   ……

</Email>

 

 

 

1.3.撰寫XML文件實例:

    根據文件的類型訂定根元素之后,接著就可以開始標示文件的內容,雖然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>

 

 

 

 

 

 

 

 

1.4.剖析(parseWell-formed XML文件:

    完成文件的標示工作之后,接下來就是檢查這份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 的瀏覽結果

2.撰寫Valid XML文件的步驟:

2.1.撰寫XML宣告(XML declaration):

    Valid XML文件所參照的DTD可以放在文件內部,也可以是另一份外部文件。DTD如果放在文件內部,所使用的XML宣告如下:

        <?xml version=1.0 standalone=yes?>

DTD如果是另一份外部文件,則所使用的XML宣告如下:

        <?xml version=1.0 standalone=no?>

2.2.設計DTD

    采用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至少有一個,BodyAttachment則可以沒有或有一個以上。

> 

宣告的結束符號。

 

    元素的內容模式(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文件,下面是一份引用外部DTDValid 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>

 












以下則是一份引用內部DTDValid 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>

 




















(二)
   
剖析(parseValid 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進行文件結構的確認。

3.XML編輯器:

    利用最簡單的文字編輯器(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來進行文件結構的確認。


第三章 XMLHTML在特性上的不同:

大部分的人都聽過HTML,透過XMLHTML的比較來原本就熟悉HTML的人來說,是學習XML的好方法。XMLHTML是不同層級的標示技術,HTML是一種特定的標示語言,包含了一組標準的元素集(element set),元素用來指示特定的文字片段在文件中所扮演的角色,每一個元素都有標準的意義。例如:<H1></H1>HTML文件中的意義是最重要的標題(heading)。除了HTML之外,還有很多種特定的標示語言,例如航空產業針對飛行器維護手冊制定了一個標示語言稱為ATA-2100,半導體產業針對電路數據制定了一個標示語言稱為PCIS,計算機產業針對軟件文件訂了一個標示語言稱為DocBook。這些特定的標示語言都有以下共同點:

●都定義了一組標簽集(tag set),每個標簽都有標準的意義及標準的使用規則,也就是有標準的文法(grammer)。

●都是為了某類型的文件或數據專門設計的。

●都使用文字處理(text processing)國際標準SGML來定義它們的標簽集與文法。

XML繼承了SGML的可擴展性(extensibility)、結構性(structure)與可確認性(validation),這三點也是XMLHTML在特性上最重要的不同,說明如下:

          

HTML

XML

可擴展性(extensibility)

卷標集與每個卷標的意義是固定的,使用者無法自行定義卷標(tags)或屬性(attribute)。

允許使用者根據需要,自行定義卷標與屬性,以便更進一步描述數據的語意。

結構性(structure)

不支持深層的結構描述。

能描述各種復雜的文件結構,如數據庫綱要 (schema)及對象導向的階層結構。

可確認性(validation)

沒有提供語法規格來支持應用程序對HTML文件進行結構確認。

可包含一個語法規格 (DTD),讓應用程序對文件進行結構確認。

 

1.XMLHTML語法比較:

1.1.XML文件必須遵守階層的元素結構(hierarchical element structure):

XML文件每一個起始標簽都要有對應的結束卷標,成對的起始卷標與結束卷標就稱為元素。每一元素都必須巢狀包覆(nested within)在另一個元素之內。例如:

<LI>HTML allows <B><I>improper nesting</B></I>

上面是一段HTML原始碼,但BI并沒有巢狀包覆的關系,且LI沒有結束標簽,所以不符合XML的語法規則。

<LI>XML required <B><I>proper nesting</I></B>

上面這個例子則符合XML的語法規則,I巢狀包覆在B之內,且每一個元素都有成對的起始卷標與結束卷標。

1.2.XMLHTML對于空元素(Empty elements)的表示方式不同:

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處理器才不至于搞混。

1.3.XML所有的屬性值(attribute value)必須以引號(quotes)夾住:

 HTML除了包含空白的屬性值必須以引號夾住外,其余的情況可以省略引號;而XML所有的屬性值(attribute value)都必須以引號(quotes)夾住。例如:

<FONT color=#FF0000>HTML attribute value</FONT>

 以上是一段合法的HTML原始碼,屬性值沒有用引號夾住,不符合XML的語法規則。

<FONT color=#FF0000>XML attribute value</FONT>

 上面這個例子符合XML的語法規則,屬性值必須用單引號或雙引號夾住。

1.4.XML標簽大小寫有區別(case-sentitive):

HTML卷標大小寫是一樣的,XML標簽大小寫則有區別。例如:

<H1>HTML is not case-sensitive, XML is.</h1>

以上是一段合法的HTML原始碼,在HTML中,H1h1是相同的標簽;但在XML中,H1h1則是不同的標簽。上面的HTML原始碼若以XML的語法來寫,就得寫成

<H1>HTML is not case-sensitive, XML is.</H1>

1.5.XMLHTML對空白(white space)的處理方式不同:

 HTML除了PRE元素內的連續空白有效外,其余的連續空白都會被視為只有一個空格符。HTML的空白包括了ASCII space&#x0020)、ASCII tab&#x0009)、ASCII form feed&#x000C)、Zero-width space&#x200B)以及 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)則不同。

1.6.XML文件只能有一個根元素(root element):

這個限制使得XML剖析器較容易確認文件已經結束了。

1.7.XML允許指定不同的字集編碼(character set encoding):

    XML的字集編碼是在<?xml?>宣告中指定,例如:

<?xml version=1.0 encoding=UTF-8>

上面的例子表示這份XML文件以UTF-8編碼。所有符合XML規格的軟件工具一定都支持ISO 10646字集,ISO 10646是一組龐大的字集,其中包含了Big5中文碼及GB2312中文碼中所有的字。ISO 10646包含了幾種編碼方式:UTF-88 bit的,UTF-1616-bit的,Unicode就是UTF-16的形式。

1.8.XML的特別保留字符(special reserved characters):

有一些字符本身就是XML語法結構的一部份,若要在XML文件中使用這些字符必須使用替代的表示法,XML使用預先定義的實體(predefined entity)來替代這些字符,如下表:

Reserved character

Predefined entity to use instead

< 

&lt;

> 

&gt;

&

&amp;

&quot;

&apos;

 

上表中前四個字符在HTML中也使用同樣的替代表示法,在HTML中稱為字符實體參引(character entity references)。

2.如何將HTML文件轉換成Well-formed XML文件:

 要將現有的HTML文件轉換成XML文件,首先要先使文件具備Well-formedness,除了要在文件的開頭加上XML宣告外(<?xml version=1.0?>),可以依循下列四個轉換步驟。

2.1.將所有的卷標轉換成適當的巢狀結構:

 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>

2.2.使每個元素都有有起始卷標與結束卷標:

 SGML允許省略標簽,只要在DTD中宣告該元素的卷標可以省略即可。在HTML 4.0 DTD中,許多標簽都是允許省略的,如元素 p, ul, 的結束卷標,甚至連元素 html, body 的起始與結尾標簽都可以省略。要將HTML文件轉成XML文件,必須將所有省略的標簽都補上。

2.3.將所有的屬性值都加上單引號或雙引號:

 HTML中,屬性值的引號有時會省略,特別是數字型態的屬性值,在XML文件中任何型態的屬性值都必須加上單引號或雙引號。在HTML中,如果屬性只有一種可能的值,甚至可能省略屬性的名稱,直接寫入屬性值。如 <ul compact>,在XML中必須寫成 <ul compact=compact>

2.4.將空元素(empty)轉換成XML的格式:

    XML對于空元素的表示有特別的格式,如下面是一段HTML原始碼:

        <IMG ALIGN=RIGHT SRC=sample.gif>

  XML中必須表示如下:

        <IMG ALIGN=RIGHT SRC=sample.gif/>

第四章 XML參考資源

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/