2016-07-07 87 views
-1

我目前正在解析器項目獲取一些文件xml格式1到另一個xml格式。更好的方法來解析一個配置文件在C++

我完成我的項目,有靜有很多的參數就知道了,他們大多是路徑的一些文件,參數列表,...

我想它很容易使用,因此我創建了一個SETTINGS.TXT:它包含像

someparameter = defaultvalue 

行此文件很容易modify.I考慮的情況下,人們想分析與相同參數的文件,所以我的應用程序是這樣的:

Do you want to change parameters? (Y/N) 
if(yes){ 
Do you want to change paramater 1? //If no value, [] stays 
        [pathbydefault] 
} 
... 
else{ load from settings.txt} 

爲了實現這個,我使用getline(),首先分割'='並將它們放在std :: map中。 我認爲這是一個糟糕的選擇,我搜索了一下,並且我發現了很多C++架構:list(真的很重要10個參數),table(不容易閱讀,代碼對其他人而言很暗)。

您建議我使用什麼解決方案? 當然,我不要求執行,只是爲了一些解決方案來考慮。一些信息:我不認爲如果它很重要,但我工作在基於Unix的系統(Mac OS或Linux),所以我不能使用Windows庫。我看到了一個Windows解決方案,但我沒有深入這一點。

+0

我使用和推薦[SimpleIni(https://github.com/brofield/simpleini)。諷刺的是,XML解析器不會將其設置存儲在XML文件中。但我不能責怪你,XML對此太難處理了。 '[section] key = value'格式非常容易。與Windows INI文件格式相同,但這些API在本世紀尚未更新,所以即使在Windows上也不應使用它們。 –

+0

謝謝,當我不使用Windows ini時,我覺得缺少更好的解決方案。 關於設置格式,我用我自己的程序解析它們,但實際上,我可以使用C++ –

+0

多年來,我已經編寫了多種語言的類來處理這個問題。您可以使此代碼複雜或簡單,以滿足您的需求。例如,你允許評論,然後你跳過這些。你可以在行尾註釋一下嗎?你是否修剪了字符串以擺脫空格?如果是的話,你是否支持轉義字符以允許它們在開始或結束時嵌入?所有這一切說,使用現有的圖書館是一個好主意,如果它符合你的許可要求,並且如果你不擔心它將來不存在的話。 – Andrew

回答

0

這個東西(恕我直言)的經驗法則是總是使用一個好的庫來解析標準數據格式,至少在任何情況下您的需求可能會繼續擴大。例如,我傾向於真正喜歡JSON,因爲它是一種簡單,易於人類讀/寫的格式,在C++中有很多優質的選擇。

這可以避免必須自己處理任何容易出錯的解析邏輯。這也使得它非常容易編寫生成或驗證你的配置文件的python腳本(因爲python也很容易訪問json,就像每種語言一樣)。

在您的代碼中,將數據格式以及集合清理分離爲地圖或您正在使用的任何數據結構可能也是一個好主意。這樣,如果您決定更改使用哪種數據格式,那麼將會更改代碼的部分。

+0

我沒有想過JSON,非常感謝!我將進一步研究這一點。有趣的是,我將使用一個非常強大的解析器來使用我個人的超級弱解析器;) –

+0

@ThéophilePace如果你覺得答案是有用的,隨時upvote它;-) –

+0

這是我的第一篇文章所以我無法在我的聲望越來越高的情況下投票贊成... –

0

一個未來的考慮是使用XML轉換語言在舊的XML文件格式和新的XML文件格式之間轉換。我不知道你是否已經這樣做,所以如果你是這樣,請不要理會。如果您不熟悉,這些語言中最常見的就是XSLT(可擴展樣式表語言轉換)。

最終用戶最好只提供XML(可以很容易地手動編輯)/ XSLT模板文件,而不是讓最終用戶向INI樣式的配置文件輸入無數選項/路徑/值到XSLT處理器。您可以更新您的C++應用程序,使其更專注於獲取來自最終用戶的每個輸入,更多地關注創建/選擇正確的XML/XSLT模板文件。

至於你提到的在基於Unix的系統上工作,你可能要考慮該處理器:http://xml.apache.org/xalan-c/

+0

我不知道XSLT,我會考慮這一點。我的問題是我的XML文件非常非常巨大(數百萬行),我不確定我將來能夠將它們放入RAM中,因此我儘量不加載它們。 關於miriad的參數,人們可以修改settings.txt,並說'不要'更改默認參數'。 謝謝Xalan,看起來我應該從一開始就使用它... –

+0

瞭解並感謝您的反饋。一旦從INI風格的設置轉換到XML設置的好處是,使用正確編寫的XSLT,您可以基本消除中間人C++應用程序,讓XSLT代碼爲您完成所有工作。祝你好運! – richkisic