XML parsing on different browsers

瀏覽器解析 XML 的不同行為

一個 XML 文件長這個樣子:一個文件類型宣告 (<?xml ?>)、一個根目錄 element 包含其他的 element。所以當 XMLHttpRequest 物件抓遠端的 XML 回來解析的時候,obj.responseXML 這個 XMLDocument Object 的 .childNodes.length 應該是 1 —— .firstChild 就是 root element 。

問題來啦:以上看似合理的 XML parsing 只發生在 Mozilla 上面。在 IE 裡面 childNodes.length 是 2,firstChild.nodeName 會傳回 … ?xml !這是怎樣?

那改用 .lastChild 去拿 root element 好了,這總不會出錯了吧。嘿嘿,不行 —— Operaobj.responseXML 更有趣:childNodes.length = 2 ,第一個 childNode 是 ?xml、第二個是 root、第三個是 … #text,nodeValue是長度 0 空字串。我檢查過,這絕對不是 Server 端的問題,因為那邊是用 PHP DOM 在生 well-formed XML 的。

最後我的解法還是用 obj.responseXML.lastChild 拿 root,不過在之前先經過一個判斷式:如果 .lastChild.nodeName == ‘#text’ 就做 removeChild 的動作。

這個解析 XML 的差異是因為各家瀏覽器 XMLHttpRequest 物件行為的不同,與 prototype.js 無關。prototype.js 只做 warpper 而已,裡面搞成這樣它應該是不知道。

還有另外一種解法是不要做 AJAX —— 做 AJAteXt,叫伺服器傳文字進來,再從 obj.responseText 抓出來處理。不是很正統而且還需要而額外寫解析函式的方法,但 GMail 好像就是這樣在抓信件內文的。

XMLHttpRequest on different browsers parses XML in different ways. An XMLDocument Object contains a <?xml ?> doctype declaration and a root element. Anything else should be child nodes under the root. Thus, when the XML file is fetched, obj.responseXML.childNodes.length should return 1, and firstChild should return the root element.

Sounds right? Not quite. What described above only occurs in Mozilla. In poor-designed IE6, childNodes.length returns 2 — firstChild.nodeName returns ?xml. Opera behaviors even weirder; childNodes.length returns 3, first two are same as IE, and the their one is a #text with zero-length string nodeValue.

I ended up using lastChild to retrive the root element after checking its nodeName; if lastChild.nodeName == ‘#test’ { removeChiid(); } .

The other solution is to abandon AJAX – use AJAteXt instead. By parse responseText on your own code, you could avoid these kind of inconsistent behaviors. Kind of non-standard method, but AFAIK, Gmail does use AJAteXt to retrieve mail text.

剪綵(2):演示實驗網站

年初接下的打工,幫老師寫物理演示實驗專案計畫的網頁。之前在 Blog 上面有提過。完成度在暑假之前就已經逼近 90% 了,不過內容因為老師一直在思考呈現的方式所以最近才開始上線。

而在老師做寫文案、拍儀器影片的時候,我就開始寫一些莫名奇妙的東西。最後變成這樣的龐然大物(圖解):


demoexp.phy.ncu.edu.tw

總之這個「網站」會縮圖、把DVD影片轉成網路上用的AVI、通知 Google 網站有更新、還會把自己變成一張光碟片(炸)。老師還頗訝異一個網站可以做這麼多事情,其實他們都是 system() 其他程式,像是 MEncoderffmpeg、mkisofs 而已。發輝無限潛能呀!很可惜的就是一般人看不到網站後台的部份;上傳內容與設定的部份反而花了我比較多時間,不在這裡說的話可能只有我和老師知道而已。

剪綵(1):系學會網站

新網站開張!

本來想要在把這兩個站處理好,開學之後來專心拿本學期的25學分,但是因為進度上都要跟別人配合,於是就 delay 到現在這星期才算正式開放了。

第一個網站是物理系學會WordPress + Gallery2 + WPG2 Plugin 的架構不難架,架起來也不難用,和系會的人一說他們就知道要怎麼用了。

經典對話:

某A人:「用 blog 程式當網站用的話,那不就像無名一樣不能______了?」
我:「那種小東西 WordPress 當然沒問題,無名那什麼拼湊出來的鳥程式…」

除了網站以外系學會還有一個要求:機器除了要跑網站,他們也同時需要可以放在會窩聽音樂、打報告而且好維護不需要常常重灌。順著「Apache Win32 is not intend for production enviroments」這個邏輯加上手癢想要測試一般人對 Linux 桌面環境的反應,我索性裝了一台 Ubuntu 6.06 拿去了。


Ubuntu Desktop

目前大家對於這台機器的 feedback 是「它不難用,只是不習慣」,雖然我已經在桌面上放了一些他們熟悉的圖示了(NO IE … 也算啦XD)。

Linux 能做的事情真的比 Windows 多,只是因為變動成本(要花時間習慣跟找答案做以前知道怎麼做的事情)所以現在還沒有大規模的跳槽。自從裝好這台機器之後,只要有人跑來跟我說「我的盜版的 Windows 又當掉了,你有沒有 SuperXP 可以借我重灌?」我就會說「我可以在30分鐘之內裝成系會電腦那個樣子,你要不要?Windows 要花 3 小時,外加一份宵夜。」換到 Linux 的變動成本嘛… 對我來說是負的XD。