プロパティツリーとXML解析の問題を後押し
-
22-09-2019 - |
質問
私はboost::property_tree
を使用しています。ドキュメントには、非常に曖昧でほとんどの部分は全体的に役に立たないです。ソースを見ると/例はどちらかという多くの助け、しませんでした。
私は思ったんだけどは、次のとおりである:
<VGHL>
<StringTable>
<Language>EN</Language>
<DataPath>..\\Data\\Resources\\Strings\\stringtable.bst</DataPath>
</StringTable>
</VGHL>
どのように反復現在のレベルのすべての要素の上にできますか?私はこれを行う場合:
read_xml(fin, bifPropTree);
VGHL::String tablePath;
BOOST_FOREACH(boost::property_tree::wiptree::value_type &v,
bifPropTree.get_child(L"VGHL.StringTable"))
{
m_StringTable->ParseEntry(v.second, tablePath);
}
ParseEntry
では、私はこれを試してみてください
VGHL::String langName = stringTree.get<VGHL::String>(L"StringTable.Language");
例外の結果は(存在していないではありません)。私もこれを試してみた:
VGHL::String langName = stringTree.get<VGHL::String>(L"Language");
同じ問題ます。
私はParseEntry
を呼び出すときに私の理解から、私はそのノードでツリーへの参照を渡しています。
これに対処するためにどのような方法は、私はプロパティツリーを使用してStringTable
の複数のエントリを持っているとき、ありますか?
解決
ParseEntryは、現在のレベルの子ノードの各々への参照を受け取ります。すでに子ノードを持っているので、だから、あなたは、ノード名を使用して値を求めることはできません。ノード名は、のv.first の中に保存されます。
あなたは、レベルを選択し、のBOOST_FOREACH の反復するために、のget_child の使用して、指定されたレベルのすべての要素を反復処理することができます。各反復子は、ノードの名前を表す一対のノードデータになります。
using boost::property_tree::wiptree;
wiptree &iterationLevel = bifPropTree.get_child(L"VGHL.StringTable");
BOOST_FOREACH(wiptree::value_type &v, iterationLevel)
{
wstring name = v.first;
wstring value = v.second.get<wstring>(L"");
wcout << L"Name: " << name << L", Value: " << value.c_str() << endl;
}
このコードは印刷します:
名前:言語、値:EN
名称:データパス、値.. \\ \\データリソース\\文字列\\ stringtable.bst
あなたが反復したくない場合は、ノード・レベルを選択し、自分の名前を使用してノードを探すことができます:
wiptree &iterationLevel = bifPropTree.get_child(L"VGHL.StringTable");
wstring valueLang = iterationLevel.get<wstring>(L"Language");
wstring valuePath = iterationLevel.get<wstring>(L"DataPath");
wcout << valueLang << endl << valuePath << endl;
このコードは印刷します:
EN
.. \\ \\データリソース\\文字列\\ stringtable.bst
他のヒント
私は、プロパティツリーを使用し、それは気の利いに見えるよう、おそらくしませんしました。いくつかの簡単な観察いえます:
万一GETのテンプレートパラメータは、戻り値の型と同じではない?
VGHL ::文字列langName = stringTree.get(...);
しかし、これはコンパイル時にエラーが生じていたとして、これは、ここでは最も可能性の高い問題ではありません。
わからないL "VGHL.StringTable.Language" 引数が動作するかどうか?