(原創) 如何使用STL寫XML轉檔程式? (C/C++) (STL) (Web) (XML)
2008-01-30 12:07
691 查看
Abstract
寫文字檔轉檔程式是很常見的需求,一般來說,這種都屬於dirty job,沒什麼技巧,純粹是迴圈硬幹,若使用STL來寫轉檔程式,不只程式超短,一個迴圈都不需要!!
Introduction
昨天網友Momo要我幫他寫一個轉檔程式,將文字檔轉成XML檔,格式如下
文字檔user_b5fix.dat
-1,-1,-1,-1,-1,-1
一元運算符,一元運算子
二叉樹,二元樹
二元運算符,二元運算子
二分查找,二分搜尋法
二進制,二進位
二極管,二極體
人工智能,人工智慧
人工過濾,手動過濾
八進制的,八進位的
XML檔tongwen.xml
<?xml version="1.0" encoding="UTF-8"?>
<manifest>
<traditional>
<phrase><s>数据</s><r>資料</r></phrase>
<phrase><s>台湾</s><r>台灣</r></phrase>
</traditional>
<simplified>
</simplified>
</manifest>
user_b5fix.dat是個純文字檔,記載著繁體中文和簡體中文的對照表,實際上檔案有三千多筆資料,因為篇幅的關係,我只列出前幾行,希望轉成XML檔後,在<s></s>內放簡體中文,在<r></r>內放繁體中文。
txt_to_xml.cpp
1#include <fstream>
10#include <vector>
11#include <string>
12#include <algorithm>
13
14using namespace std;
15
16
21int main() string op(string& s) s.replace(s.find(","), 1, "</s><r>");
return "<phrase><s>" + s + "</r></phrase>";
}
就是我們自己寫的global function,首先將","替換成</s><r>,然後在每行前後加上XML tag。
或許你會覺得transform()為了轉換規則,還需另開一個global function很麻煩,在boost和C# 3.0的lambda就是為了解決這個問題,可以直接將轉換規則透過lambda寫在transform()裡。
31行
outFile << "<?xml version=\"1.0\" encoding=\"UTF-8\"?>" << endl << "<manifest>" << endl << "<traditional>" << endl;
處理XML檔頭所需的字串,在C++裡,不只cin、cout可以使用<<喔,檔案也可以。
32行
copy(svec.begin(), svec.end(), ostream_iterator<string>(outFile, "\n"));
將轉好的vector資料copy到XML檔。
33行
outFile << "</traditional>" << endl << "<simplified>" << endl << endl << "</simplified>" << endl << "</manifest>";
處理XML檔檔尾字串。
35行
inFile.close();
outFile.close();
對兩個檔案進行關檔動作。
Conclusion
本來發下豪語要在20行內寫出來,結果現在扣掉註解,還需26行,哈。若使用boost的lambda還可以再省掉三行,不過最少全部使用STL解決,和我預期的目標接近。
若是C#和Java coder看到這種程式碼應該相當震驚,回想我第一次看到STL時那種驚訝的表情,竟然完全沒用到一行迴圈!!這正是STL優雅之處。
寫文字檔轉檔程式是很常見的需求,一般來說,這種都屬於dirty job,沒什麼技巧,純粹是迴圈硬幹,若使用STL來寫轉檔程式,不只程式超短,一個迴圈都不需要!!
Introduction
昨天網友Momo要我幫他寫一個轉檔程式,將文字檔轉成XML檔,格式如下
文字檔user_b5fix.dat
-1,-1,-1,-1,-1,-1
一元運算符,一元運算子
二叉樹,二元樹
二元運算符,二元運算子
二分查找,二分搜尋法
二進制,二進位
二極管,二極體
人工智能,人工智慧
人工過濾,手動過濾
八進制的,八進位的
XML檔tongwen.xml
<?xml version="1.0" encoding="UTF-8"?>
<manifest>
<traditional>
<phrase><s>数据</s><r>資料</r></phrase>
<phrase><s>台湾</s><r>台灣</r></phrase>
</traditional>
<simplified>
</simplified>
</manifest>
user_b5fix.dat是個純文字檔,記載著繁體中文和簡體中文的對照表,實際上檔案有三千多筆資料,因為篇幅的關係,我只列出前幾行,希望轉成XML檔後,在<s></s>內放簡體中文,在<r></r>內放繁體中文。
txt_to_xml.cpp
1#include <fstream>
10#include <vector>
11#include <string>
12#include <algorithm>
13
14using namespace std;
15
16
21int main() string op(string& s) s.replace(s.find(","), 1, "</s><r>");
return "<phrase><s>" + s + "</r></phrase>";
}
就是我們自己寫的global function,首先將","替換成</s><r>,然後在每行前後加上XML tag。
或許你會覺得transform()為了轉換規則,還需另開一個global function很麻煩,在boost和C# 3.0的lambda就是為了解決這個問題,可以直接將轉換規則透過lambda寫在transform()裡。
31行
outFile << "<?xml version=\"1.0\" encoding=\"UTF-8\"?>" << endl << "<manifest>" << endl << "<traditional>" << endl;
處理XML檔頭所需的字串,在C++裡,不只cin、cout可以使用<<喔,檔案也可以。
32行
copy(svec.begin(), svec.end(), ostream_iterator<string>(outFile, "\n"));
將轉好的vector資料copy到XML檔。
33行
outFile << "</traditional>" << endl << "<simplified>" << endl << endl << "</simplified>" << endl << "</manifest>";
處理XML檔檔尾字串。
35行
inFile.close();
outFile.close();
對兩個檔案進行關檔動作。
Conclusion
本來發下豪語要在20行內寫出來,結果現在扣掉註解,還需26行,哈。若使用boost的lambda還可以再省掉三行,不過最少全部使用STL解決,和我預期的目標接近。
若是C#和Java coder看到這種程式碼應該相當震驚,回想我第一次看到STL時那種驚訝的表情,竟然完全沒用到一行迴圈!!這正是STL優雅之處。
相关文章推荐
- 如何使用STL寫XML轉檔程式? (C/C++) (STL) (Web) (XML)
- 学会使用filter过滤器过滤字符集,以及如何配置web.xml
- Web设计中如何使用XML数据源对象(2)
- (原創) 如何正確的使用迴圈(使用for_each)? (C/C++) (STL) (template)
- (原創) 如何在Ubuntu中使用漂亮的中文字型? (OS) (Linux) (Ubuntu) (Web) (FireFox)
- Web设计中如何使用XML数据
- (原創) 如何使用subscripting的方式新增std::map? (C/C++) (STL)
- 如何使用web.xml配置参数,并在serlvet取得该值
- (原創) 如何使用stable_sort() algorithm? (C/C++) (STL)
- Web设计中如何使用XML数据
- (原創) 如何使用C++的標準函式庫進行排序? (C/C++) (STL)
- (原創) 如何使用queue? (C/C++) (STL)
- 用javascript操作xml-->Web设计中如何使用XML数据源对象(转载)
- Web设计中如何使用XML数据源对象(2)
- (原創) 如何将array转成std::vector? (使用vector.insert) (C/C++) (STL)
- (原創) 如何使用remove() algorithm? (C/C++) (STL)
- (原創) 如何使用for_each() algorithm? (C/C++) (STL)
- (原創) 如何将array转成std::vector? (使用constructor) (C/C++) (STL)
- (原創) 如何使用find_first_of() algorithm? (C/C++) (STL)
- spring 在web.xml 里面如何使用多个xml配置文件