這是第一次嚐試用 D 語言寫真正有用的東西,一個很簡單的 DOM-like XML Parser,概念上是參考 PHP SimpleXML 的做法,直接把 XML 檔案的結構 map 成記憶體裡的一個樹狀結構。
花的時間很短,不包含 SAX XML 的 Parser(我用現成的),總共只花了兩天就完成所有的工作和文件,扣除註解,所有程式碼不到五百行,另外寫 Embeded API Document 的時間比 coding 還久,本來五百行不到的程式碼也變成一千多行。XD
在寫這個函式庫的過程中,可以發現 D 強大的地方,比 C++ 簡潔又比 Java 功能強大,還內建單元測試和合約設計,所以這次我試著嚐試單元測試導向和合約程式設計的方法來建立這個函式庫,結果真的讓介面一開始就切得很清楚,除錯時間也少很多。
而 D 自己的 Embedded Document 格式,和 Doxygen 比起來,和程式碼擺在一起比較沒那麼突兀,而利用 candydoc 產生的網站,我覺得比 Doxygen 還要來得漂亮。
廢話不多說,文件在 http://brianhsu.moe/SimpleXMLD,下載也放在裡面,還在等 dsource 看能不能讓我 hosting 在上面。
簡單來說就是抄 PHP SimpleXML 的做法,直接把 XML 檔案在記憶體建成一個完整的 tree 而已。
XML 檔(test.xml):
text
node 1
node 2
可以在 D 語裡寫的程式裡用這隻 SimpleXMLD Library 輕易地存取上面的 XML 檔。
import SimpleXMLD.all;
void main ()
{
// Just load XML from disk file an build an tree structure
SimpleXML root = SimpleXML.loadFile ("test.xml");
// Get node attribute
char [] isRoot = root.attributes["isRoot"]; // Now isRoot="true"
// Get node data of hello
SimpleXML [] hello = root["hello"];
// This will output "text"
Stdout (hello[0].data);
// Iterate over all child
foreach (SimpleXML node; root) {
char [] tagname = node.tag;
char [] textdata = node.data;
}
// Iterate over all olny child named "node"
foreach (SimpleXML node; root["node"]) {
char [] tagname = node.tag;
char [] textdata = node.data;
}
}
回響