1. 程式人生 > >簡單的XML讀取器

簡單的XML讀取器

切割 解析 lose 功能 ons 後來 .cpp .cn 檢查

  • XML 指可擴展標記語言(EXtensible Markup Language)

(有個很明顯的槽點),是一種主要設計用來數據傳輸存儲的語言。

有關語法規則我是參考了這個鏈接。

http://www.w3school.com.cn/xml/xml_syntax.asp

看 gcc4 的時候覺得數據驅動編程很酷,於是順帶覺得xml很酷,正好暑假閑就寫了個xml讀取器看看,鼓搗了幾天,弄好了大致上的功能,這裏所說大致上,是能夠滿足檢查語法錯誤並給出錯誤信息到標準輸出設備(不保證報錯信息絕對有用)。如果滿足語法規則,就能正確讀取xml所描述的數據並保存成一顆元素樹。

以上這些是初期的目標,大體上實現了,接下來再說說另外想要實現的

1.實現一個接口類,提供能使用戶方便使用的功能足夠強大的接口去訪問讀取出來的 xml 樹。比如查找所有 name 為 "title" 的標簽

2.正確處理聲明

3.正確處理註釋(其實我覺得像現在這樣跳過忽略就挺好的)

4 .正確處理 DOCTYPE,不得不說,這個的語法我覺得比xml的要復雜, xml 這個算良心級的簡單易解析的語法我都寫出了那又臭又長的代碼,完成這個目標的工作量讓我敬而遠之,感覺不太可能會去寫了。

說說寫的過程的一些感受, xml 的設計者良心大大地好啊,因為 tag 的對稱 close 的要求,可以很方便地用一個堆棧去完成讀取建樹過程,錯誤檢查難度也下降很多

各種語法上看似苛刻的規定雖然麻煩了它的編寫(真的會有人手寫這個嘛,怎麽想都是程序生成靠譜啊。。),但是卻很有利於去讀取它,可以經常一言不合就報錯,哈哈,寫起來輕松不少。另外就是因為是用 c++ 寫它的,所以本能地就用了面對對象的寫法,後來發現不對,一大半代碼是由 buildTree 組成的,有一種以前沒學函數寫 c 語言的感覺,後來代碼就變成了這樣大而不當的樣子(快200行的成員函數你怕不怕!)

https://github.com/Dadio44/TxmlReader/blob/master/TxmlReader/TxmlReader.cpp

後來想了想,這種算法比較復雜的代碼(又設計到很多局部變量),幹脆把解析過程放在非成員函數,把大函數切割成許多小函數,可讀性,可修改性,可重用性都會好很多,所以說寫代碼時千萬不能偷懶,覺得這裏只是需要怎麽樣怎麽樣,這樣就好了,結果經驗表明一次把代碼寫好是不可能的,以後總要這樣那樣,隨時做好代碼會變得面目全非的準備比較好,切莫圖一時之快。這個代碼需要好好地 reconstructe 。但是,以上的目標都要建立在我閑下來又心情好的情況下,比較仔細想想老坑還是有很多沒填的。。。

最後這個是完整代碼

https://github.com/Dadio44/TxmlReader/tree/master/TxmlReader

簡單的XML讀取器