星期三, 1月 21, 2009

有關File I/O的兩三事(3) - XML

拖了好久了,是該做一個尾聲啦XD

XML(wiki),這個我從大一就知道但是從來都不知道在幹麻的東西XD(要說也蠻簡單的,就是一堆tag和value所組成的XD),後來寫程式的時候陸續遇到,才發現了很多很重要的東西。XML本身並不難,規範也很清楚,那麼最有趣的問題。

有趣問題: XML到底能夠拿來幹麻 XD?

如果能夠搞清楚拿來幹麻,我想XML才會表現出其重要的意義,XML的目的只有一個,傳遞資訊,也就是說,A告訴B一些訊息,重點是,A要用怎麼樣的方法? 今天人類在溝通的時候,用語言傳遞訊息真的是一件很神妙的事,但是相對而言,電腦並沒有這麼聰明。

那麼XML怎麼傳遞,大部分的比較後期的高階程式語言都具備有XML Parser(C++ Standard沒有...Orz),parser出來有什麼tag name對應什麼tag value,是一件非常快速的事,那麼跟binary file差在那裡? XML非常的彈性,基本上對方只要知道你的tag就可以抓出值了,不用去記得你所傳遞的message format為何(普天同慶,你可以不用算第幾個bytes了XD),如果你在對方的要求之外又多寫了好幾個tag,他parser到略過即可,其實也不用太管你XD。說穿了XML還是需要file format(要知道的話,可以看看DTD),只是這個format比較彈性。

回到binary tree的例子,如果照著(2)的話,我們可能會寫出這樣子的XML

<nodelist>
<node number="1">
<value>1</value>
<left number="2" />
<right number="3" />
</node>
<!-- a lot of nodes -->
</nodelist>

可是在XML上,我們的binary tree可能會有更彈性的寫法,例如說

<rootnode>
<value>1</value>
<left>
<value>2</value>
<left> ...</left>
<right> ...</right>
</left>
<right>
<value>3</value>
<left> ... </left>
<right> ... </right>
</right>
</rootnode>

在這樣子的XML中,寫出相對應的程式,可以邊parser邊建樹,也不限定是binary tree,只要是tree就行了XD 如果在第二個例子中,可能沒有搞好,我們就得重來了,但是在這邊,從binary tree變成B tree似乎較為容易

但是XML不是沒有缺點,雖然彈性,但是有兩個主要的缺點

  • 檔案肥大
    算算剛剛的tree佔了幾個byte就知道了XD 有一好沒兩好,這是躲不掉的
  • 需要parser
    parser不是壞事,重點是如果想要在XML中找到一筆資料,你大概就知道問題在那裡了XD,還有,parser大量資料時,電腦並不如你所想像來的快XD,真的嗎,來試試這個3+2郵遞區號 XMLXD。

File I/O並不如所想像中來的難,但是要搞到好,及搞到快,並不是這麼容易,binary file具有快速及省空間的優點,但是XML在擴充上的驚人彈性抑是一個不錯選擇,但是這兩種方法都端看你怎麼設計format,這才是困難之處,給你再好的工具,用了過差的設計方法,還是有可能讓程式若入一個讓人驚訝的神奇事件中XD。

順帶一提,何謂直接寫,如果今天我要寫入一串數字,我就在檔案中寫了這種神妙方法

1 2 3 4 5 6 7

這種方法大概在一般的資訊系大一學生看見,如果要寫成績處理系統可能會更常見XD 所謂的方法沒有絕對的好壞,自己試一試就知道了XD

---
唬爛結束XD