天天看點

XML的誕生

首先,讓我們來回顧一下可擴充置智語言XML(eXtensible Markup Language)的發展簡史。

----XML有兩個先驅--SGML和HTML,這兩個語言都是非常成功的置智語言,但是它們都在某些方面存在着與生俱來的缺陷。SGML(Standard Generalized Markup Language)的全稱是标準通用置智語言,它為文法置标提供了異常強大的工具,同時具有極好的擴充性,是以在分類和索引資料中非常有用。但是,SGML非常複雜,并且價格昂貴,幾個主要的浏覽器廠商都明确拒絕支援SGML,使SGML在網上傳播遇到了很大障礙。

----相反,超文本置智語言HTML(HyperText Markup Language)免費、簡單,在世界範圍内得到了廣泛的應用。它側重于首頁表現形式的描述,大大豐富了首頁的視覺、聽覺效果,為推動WWW的蓬勃發展、推動資訊和知識的網上交流發揮了不可取代的作用。可是,HTML也有如下幾個緻命的弱點,這些弱點逐漸成為HTML繼續發展應用的障礙。

    • HTML是專門為描述首頁的表現形式而設計的,它疏于對資訊語義及其内部結構的描述,不能适應日益增多的資訊檢索要求和存檔要求。
    • HTML對表現形式的描述能力實際上也還非常不夠,它無法描述矢量圖形、科技符号和一些其他的特殊顯示效果。
    • HTML的标記集日益臃腫,而其松散的文法要求使得文檔結構混亂而缺乏條理,導緻浏覽器的設計越來越複雜,降低了浏覽的時間效率與空間效率。

----正因為如此,1996年人們開始緻力于描述一個置智語言,它既具有SGML的強大功能和可擴充性,同時又具有HTML的簡單性。XML就是這樣誕生的。

----正象SGML和HTML一樣,可擴充置智語言XML也是一種置智語言,它通過在資料中加入附加資訊的方式來描述結構化資料。不過,XML并非象HTML那樣,隻提供一組事先已經定義好的标記。準确地說,它是一種元置智語言,允許程式開發人員根據它所提供的規則,制定各種各樣的置智語言。在XML中,置标的文法是通過文檔類型定義DTD(Document Type Definition)來描述的,也就是說,通過DTD來描述什麼是有效的标記,并進一步定義置智語言的結構。除了定義置标的文法外,為了明确各個标記的含義,XML還使用與之相連的樣式單(style sheet)來向應用程式,比如浏覽器,提供如何處理顯示的訓示說明。一言以蔽之,XML是通過資料文檔、DTD、樣式單三個分離的部分來描述資料的。

----雖然XML貌似複雜,但它有一些突出的優點:

----1. 良好的可擴充性。XML允許各個不同的行業根據自己獨特的需要制定自己的一套标記,同時,它并不要求所有浏覽器都能處理這成千上萬個标記,同樣也不要求一個置智語言能夠适合各個行業各個領域的應用,這種具體問題具體分析的方法更有助于置智語言的發展。

----2. 内容與形式的分離。正如前面所說,XML中資訊的顯示方式已經從資訊本身中抽取出來,放在了"樣式單"中。這樣做便于資訊表現方式的修改,便于資料的搜尋,也使得XML具有良好的自描述性,能夠描述資訊本身的含義甚至它們之間的關系。

----3. 遵循嚴格的文法要求。XML不但要求标記配對、嵌套,而且還要求嚴格遵守DTD的規定。這增加了網頁文檔的可讀性和可維護性,也大大減輕了浏覽器開發人員的負擔,提高了浏覽器的時間空間效率。

----4. 便于不同系統之間資訊的傳輸。不同企業、不同部門中往往存在着許多不同的系統,XML可以用作各種不同系統之間的交流媒介,是一種非常理想的網際語言。

----5. 具有較好的保值性。XML的保值性來自它的先驅之一--SGML語言,可以為文檔提供50年以上的壽命。

----正是基于這些優點,國際标準化組織--網際網路聯盟W3C(World Wide Web Consortium)推薦XML作為第二代網頁釋出語言。

----最後,讓我們來看一個完整的XML例子,以便對XML的整體機制有一個大緻的了解。在下面的例子中,我們用XML來描述一個學生花名冊的資訊清單。我們先為這些資料定義一個DTD:

----Stuml.dtd

<?xml version="1.0" encoding="GB2312"?>

<!ELEMENT 學生花名冊 (學生)*>

<!ELEMENT 學生 (學号, 姓名, 性别, 籍貫, 出生日期)>

<!ELEMENT 出生日期 (年, 月, 日)>

<!ELEMENT 學号 (#PCDATA)>

<!ELEMENT 姓名 (#PCDATA)>

<!ELEMENT 性别 (#PCDATA)>

<!ELEMENT 籍貫 (#PCDATA)>

<!ELEMENT 年 (#PCDATA)>

<!ELEMENT 月 (#PCDATA)>

<!ELEMENT 日 (#PCDATA)>

----關于學生花名冊資訊的标準XML文檔是這樣的:

----Student.xml

<?xml version = "1.0" encoding="GB2312" standalone = "no"?>

<!DOCTYPE 學生花名冊 SYSTEM "stuml.dtd">

<?xml-stylesheet type="text/xsl" href="mystyle.xsl" target="_blank" rel="external nofollow" ?>

<學生花名冊>

<學生>

<學号>001</學号>

<姓名>張三</姓名>

<性别>男</性别>

<籍貫>北京市</籍貫>

<出生日期>

<年>1980</年>

<月>3</月>

<日>1</日>

</出生日期>

</學生>

<學生>

<學号>002</學号>

<姓名>李四</姓名>

<性别>女</性别>

<籍貫>河北省</籍貫>

<出生日期>

<年>1979</年>

<月>5</月>

<日>12</日>

</出生日期>

</學生>

</學生花名冊>

----現在我們為它制定一個樣式單,以描述這些資料的顯示:

----Mystyle.xsl

<?xml version="1.0" encoding="GB2312"?>

<xsl:stylesheet xmlns:xsl="http://www.w3.org/TR/WD-xsl"

xmlns="http://www.w3.org/TR/REC-html40" result-ns="">

<xsl:template><xsl:apply-templates/></xsl:template>

<xsl:template match = "/">

<HTML>

<HEAD>

<TITLE>學生花名冊</TITLE>

</HEAD>

<BODY>

<xsl:apply-templates select="學生花名冊"/>

</BODY>

</HTML>

</xsl:template>

<xsl:template match = "學生花名冊">

<xsl:for-each select="學生">

<UL>

<LI><xsl:value-of select="姓名"/></LI>

<UL>

<LI>學号: <xsl:value-of select="學号"/></LI>

<LI>性别: <xsl:value-of select="性别"/></LI>

<LI>籍貫: <xsl:value-of select="籍貫"/></LI>

<LI>出生年: <xsl:value-of select="出生日期/年"/></LI>

<LI>出生月: <xsl:value-of select="出生日期/月"/></LI>

<LI>出生日: <xsl:value-of select="出生日期/日"/></LI>

</UL>

</UL>

</xsl:for-each>

</xsl:template>

</xsl:stylesheet>

----在IE5中看到的XML檔案的顯示結果是這樣的:

l 張三

m 學号: 001

m 性别: 男

m 籍貫: 北京市

m 出生年: 1980

m 出生月: 3

m 出生日: 1

l 李四

m 學号: 002

m 性别: 女

m 籍貫: 河北省

m 出生年: 1979

m 出生月: 5

m 出生日: 12

----有興趣的讀者可以用"記事本"錄入上面這三個檔案,分别存盤後放在一個目錄中,然後用IE5打開檔案student.xml,看看結果是不是這樣。