2009年10月26日 星期一

relaxNG

總算想清楚了。
relaxNG就像是yacc中的文法(grammar),我應該寫個小程式,將讀入的relaxNG產生一個.c檔,這個.c檔將像是一個state-machine,順著relaxNG所定義的文法來parse新讀入的檔案,確定該檔案有無follow relaxNG所定義的文法。至於若符合時應該做什麼動作,屬於meta層級的事,再透過在relaxNG文法中的特別格式,可能可以參考relaxNGCC的作法,用的方法加在.c檔中。
希望這種模式會成功。
有趣的是,將文法轉成.c檔,及.c檔中處理讀入的xml檔,都將使用libxml,meta-language及language層次都預設了libxml,寫來應該會好玩。
這個讀relaxNG產生.c檔的程式,寫完應該可以opensource出去,讓更多對xml grammar(如relaxNG)的無力可以被改變。否則每次都是先對讀入的XML檔,先走過一次tree後check整株tree是否合於文法,再開始重頭走一次tree,在對的地方做一些對的事,這種重覆walk-tree的作法真令人生厭。希望前述的作法可以讓整個xml parsing有效率...

2009年10月21日 星期三

xml namespace

xml的namespace好像是一件容易令人困惑的定義,其實很簡單。
為了要讓一份xml文件可以被正確解讀,xml依著什麼樣的規範,意謂著這是一份描寫化學反應、食譜、電子書、網頁等等,都由namespace來確定。一份完全沒有namespace定義的xml檔,將完全無法被解讀。namespace定義的方式就是透過xmlns="..."來處理。
namespace在xml中還扮演另一個角色,即qualify tag。xml文件中可能會有其他的定義需求,如epub格式中的package檔,就需要要metadata的相關定義,該定義可能來自某一個組織的共識,也有一定的約定俗成的規矩,若package中使用的tag與metadata中的tag衝突,該如何處理?最簡單的方式就是給metadata一個namespace,然後所有metadata用到的tag都用xx:tag的方式處理。xx表示為了metadata範圍需要所定義的namespace。然後透過 xmlns:xx="...."的方式定義xx這個新的namespace。而這個namespace的範圍只有在他出現的這個tag中。所以任何他的子tag或attr都可以看見他。類似於一般程式中的binding概念。

2009年10月14日 星期三

開啟ePUB的起點

ePUB格式的閱讀,是從開啟.epub檔後,META-INF這個目錄中的container.xml開始。
這個檔案必需要有下列資訊:
1. root level element: with attributes version="1.0", xmlns="urn:oasis:tc:opendocument:xmlns:container"
2. 第二階的element: 可以specify多個,但必需至少要有一個有attributes media-type="application/oebps-package+xml"。

META-INF目錄還可以有下列幾個檔案,但不是必要的:
1.manifest.xml
2.metadata.xml
3.signatures.xml
4.encryption.xml
ePUB還強制要求encryption只能用w3的模式。
這整個模式是否可行,需要再想想。

2009年10月13日 星期二

xml的parsing

開始要準備做電子書閱讀器的軟體了。
電子書閱讀器所鎖定電子書籍的格式是ePUB的格式,其實就是xhtml放電子書籍的內容,xml放電子書籍的meta data,然後package起來成為可讀的電子書籍。
這就需要大量的xml parsing的工具。
開始找可以用的open source工具,也考慮是否該自己利用yacc/lex寫個parser。
後來放棄自己寫parser的想法,原因反而是字型編碼。
lex中所scan出的token,其實是ascii的token。ePUB中的xml,放的會是電子書籍的meta data,其中就會有中文(採用utf-8編碼),但lex無法scan非token的本文,放在間的描述性文字,如何可成為被scan的token?與一般程式相近的,大概只能用string。
想來想去,還是決定用現成的eXpat package。雖然對event-driven的expat是否能好好處理電子書籍的頁面有些猶疑,但先這樣做做看吧!