2016-07-07 9 views
-1

現在、パーサープロジェクトでいくつかのファイルxmlフォーマット1を別のxmlフォーマットに変換しようとしています。C++でconfigファイルを解析する方が良い

私はとても使いやすいようにしたいと思い

私は私のプロジェクトを終え、そして知るべきパラメータの静かなたくさんある、それらのほとんどは、いくつかのファイルへのパスは、パラメータのリスト、...私はたsettings.txtを作成:

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} 
:それはこのファイルには、人々は同じパラメータを持つファイルを解析したい場合考えるmodify.Iに簡単ですので、私のアプリケーションが似ている

someparameter = defaultvalue 

ような行が含まれています

これを実装するには、getline()を使用し、最初に '='で分割してstd :: mapに配置します。 これは悪い選択だと思うので、私は検索して、C++のための多くのアーキテクチャを見つけました:リスト(実際には10個のパラメータが重い)、テーブル(読みにくく、コードは他の人には暗いです)。

私にはどのような解決方法をお勧めしますか? もちろん、いくつかのソリューションを検討するには、実装を依頼しないでください。

いくつかの情報:私は大したことではないと思うが、私はUnixベースのシステム(Mac OSまたはLinux)で作業しているので、Windowsライブラリを使用することはできません。私はWindowsのソリューションを見たが、私はこれ以上は進まなかった。

+0

私が使用して、[SimpleIni](https://github.com/brofield/simpleini)をお勧めします:あなたがUnixベースのシステムに取り組んで言及したよう

は、あなたは、このプロセッサを検討する必要があります。 XMLパーサーがその設定をXMLファイルに保存しないということは皮肉なことです。しかし、私はあなたを責めることはできませんが、XMLはあまりにも扱いにくいです。 '[section] key = value'形式ははるかに簡単です。Windows INIファイル形式と同じですが、これらのAPIは今世紀には更新されていないため、Windowsであっても使用しないでください。 –

+0

ありがとう、私はWindowsのiniを使用しないときは、より良い解決策を見逃すように感じた。 設定のフォーマットについては、私自身のプログラムで解析していますが、実際には、C++を使うことができます –

+0

これを何年もかけて多言語で処理するクラスを作成しました。このコードを必要に応じて複雑なものや簡単なものにすることができます。たとえば、コメントを許可してからそれらをスキップしますか?行末にコメントがありますか?スペースを取り除くために文字列をトリミングしますか?はいの場合、エスケープ文字をサポートして、開始時または終了時に埋め込むことができますか?すべてのことが言った、既存のライブラリを使用することはあなたのライセンス要件に合っていればいいアイデアです、もしそれが将来存在しないことを心配しなければ、 – Andrew

答えて

0

このような経験則(IMHO)は、少なくとも、ニーズが拡大し続ける可能性のあるあらゆる状況で、標準データ形式を解析するために常に良いライブラリを使用することです。例えば、私はJSONを好きになる傾向があります。なぜなら、シンプルで人間らしい読み込み/書き出しが容易な形式であり、C++でかなり良い品質の選択肢があるからです。

これにより、バグの原因となる解析ロジックを自分で処理する必要がなくなります。また、非常に簡単にできます。あなたの設定ファイルを生成または検証するpythonスクリプトを書いてください(Pythonはjsonにも非常に簡単にアクセスできるので、すべての言語がそうです)。

あなたのコードでは、データフォーマットとコレクションをマップや使用しているデータ構造にきれいに分けることをお勧めします。こうすることで、使用するデータ形式を変更する場合に変更されるコード部分が含まれます。

+0

JSONとは思っていませんでした。ありがとうございました!私はこれをさらに詳しく見ていきます。面白いのは、私は非常に強力なパーサーを使って私のpersonnal super weak parserを使用するつもりです; –

+0

@ThéophilePace答えが役に立つと感じたら、それをアップウォークしてください;-) –

+0

これは私の最初の投稿の一つですだから私の評判が高くなる前に私はupvoteを傾ける... –

0

今後、XML変換言語を使用して、古いXMLファイル形式と新しいXMLファイル形式を切り替えることが検討されます。あなたがすでにこれをやっているのかどうかわからないので、もしそうなら無視してください。よく知られていない場合、これらの言語の最も一般的なものはXSLT(eXtensible Stylesheet Language Transformations)です。

INIスタイルの設定ファイルにエンドユーザが無数のオプション/パス/値を入力するのではなく、エンドユーザは理想的にはXML(手動で簡単に編集できる)/ XSLTテンプレートファイルXSLTプロセッサに転送します。エンドユーザーからのすべての入力を取得することや、適切なXML/XSLTテンプレートファイルを作成/選択することに集中するように、C++アプリケーションを更新することができます。 http://xml.apache.org/xalan-c/

+0

私はXSLTについて知りません、私はそれを検討するつもりです。私の問題は、私のXMLファイルが非常に巨大であり(数百万行)、将来私はそれらをRAMに入れることができないため、完全に読み込まないようにしています。 パラメータのミラードについて、人々はsettings.txtを変更し、「デフォルトパラメータを変更する」と答えます。 Xalanありがとうございました。私は最初からそれを使用していたはずです... –

+0

フィードバックに感謝してありがとうございます。いったんINIスタイルの設定からXML設定に移行するのがうれしいことは、適切に書かれたXSLTを使用すると、基本的に中間のC++アプリケーションを排除し、XSLTコードですべての作業を実行できることです。がんばろう! – richkisic

関連する問題