XML的未來現在你已經知道XML。確實,結構有點複雜,而且DTD有各種可以定義文件可以包含的內容的選項。但還不只這些。
考慮一個資料交換對其很重要的產業,如銀行。銀行使用所有權系統來追蹤內部的交易,但是如果他們在Web上使用一種通用的XML格式,那麼他們必須描述交易資訊給另一個機構或應用程式(如Quicken或MS Money)。當然,他們也可以在Web頁面上表示數據。 FYI:這個標記不存在。它叫做OFEX,開放金融交易格式(Open Financial Exchange)。
在某種情況下,如果PC上的IE 4碰到一個
這裡我們有三個XML應用程序,看起來與Andy Grove在70年代看到的加法機、打字機和鉛筆不同。但與最終出現在PC上的應用程式相似,XML的好處可以被一般性地描述為:「當你使用人類和機器可讀的標記符來描述你的資料時,會有好事發生的。」
這些好事是什麼呢?我不知道。但是我也不知道我的PC上的下一代程式將會是什麼樣子。只要資料以這種方式標記,可以產生不同的應用。
你開始考慮它會擴展到什麼程度了嗎?
我們有很多XML的實際應用可以談論,我會在不久的將來談到它們的。既然我們都是網民,以後將是XSL(擴展樣式語言-
eXtensible Style Language)了。
順便提一句,這個食譜確實是我媽媽_的,而且很傑出。如果你用之,再加半杯碎椰子。
我寫這篇文章是因為我真心關心你對我的看法。我擔心的是:如果你讀過我寫的XML簡介然後準備開始寫自己的XML文件。於是你開始尋找一個已經建立的DTD來表示你的資訊。你找到一個,如下:
%attr.lang;
value CDATA #FIXED "TEXT">
img.type CDATA #REQUIRED
img.data ENTITY #REQUIRED">
馬上你就會認為Jay一定是個白痴。他沒有說關於ATTLIST和ENTITY的任何事- 不管它們是什麼。
那麼讓我們來談談這件事,先有一點耐心。
上面這些行可能不好看,但實際上沒什麼。它們被用在DTD中來定義XML文件中的屬性和實體。了解HTML的人會對這很清楚。屬性是帶有HTML標記符的條目,用來更精確地描述標記符。在常出現的中,有兩個屬性:height和width。你在後面會看到,在XML文件中使用屬性與之很相似。
對實體也沒有什麼新東西。如果你用過&,你就已經掌握了最基本的東西。一個被&和分號包圍起來的字串用來表示另一個或一套字元。 (這裡有ISO實體的完整清單。)
當然,XML中屬性和實體還有其它功能。這就不可避免地要引入語法,雖然不太多。一旦知道了這些,就會不費勁地使用XML文件。
簡化食譜
如果你讀過我寫的XML簡介,你會記得用簡單的標記符表示的食譜中的組成成分,如
這個方法有實際的優點:可以更容易控制資料。用第一種方法,
我可以用如下的結構來取得相似的功能:
這可以被處理,但是有兩個問題:首先,item元素包含了混合的內容:文字和其它標記符。我很快就發現應該盡量避免這種結構。其次是標記符幾乎沒有獨立的意義。很難想像只要units而不要實際的組成成分的情況。這些條目可以被簡單描述,我寧願把它們當作屬性。
首先要注意的是屬性名,quantity和units只有被能夠翻譯它們的應用程式處理時才有意義。
在被包含在有效的文檔中之前,應告訴DTD來允許它。對於上面的ingredient元素,我們在DTD中只包含了以下程式碼:
第一行看起來很熟悉- 在任何DTD中都能看到的標準元素定義。每個ATTLIST行都依序包含以下資訊:
這是屬性依附的元素。
這裡定義屬性名稱。
這裡設定屬性類型。 CDATA代表字元資料。意味著處理器在屬性內可以得到文字。
最後的部分定義屬性的預設值。可以使用實際的數值,如3。這樣,XML中空白長度的屬性值將為3。輸入的值將覆蓋缺省值。
在上面的例子中我沒有設定特定的數量,而是使用XML的關鍵字#REQUIRED。它告訴處理器次屬性必須包含一個值。如果空白,文件將不被處理。
缺省值有另外兩個關鍵字。第一個是#FIXED - 如果屬性值在整個文件中保持相同的值。假設我定義一個image的標記符屬性,所有影像的大小都相同,比如說100*50像素,就可以在DTD中這樣定義屬性:
另一個關鍵字是#IMPLIED,表示屬性可以包含值或是空的。
下面讓我們來看看屬性類型。
如果你決定自己寫DTD,可能需要一本解釋ATTLIST語句中所有組合的XML的書。但如果借用DTD,或許只知道CDATA和另外三種屬性就性了。
第一個是ID。它要求屬性的值在文件中不重複。使用過資料庫的人都知道唯一標誌符的必要性。 DTD ATTLIST語句看起來像這樣:
很難想像沒有#REQUIRED缺省值的ID屬性類型。如果那樣,任何重複的或空的ID都會迫使處理器傳回一個錯誤。 ID必須以字母或底線開始且不能包含任何空格。
NMTOKEN類型也使用上面的命名規則。但是允許重複。它被用做傳遞資料給應用程式的保障。大多數程式語言,包括Java和JavaScript,在模組名稱中不能有空格。大多數情況下,最好保證屬性符合它們的規則。
最後是枚舉類型,不需要特定的關鍵字。而是用"|"符號包含在括號內的值,例如:
如果有有限的可能的屬性值,可以用這種方式。
不會認為今天的課程無趣吧,那就接著讀吧!