Frage

Ich verwende boost::property_tree. Die Dokumentation ist sehr vage und insgesamt nicht hilfreich für den größten Teil. Mit Blick auf die Quelle / Beispiele half nicht, dass viel, auch nicht.

Was ich frage mich, ist die folgende:

<VGHL>
    <StringTable>
        <Language>EN</Language>
        <DataPath>..\\Data\\Resources\\Strings\\stringtable.bst</DataPath>
    </StringTable>
</VGHL>

Wie kann ich Iterierte über alle Elemente auf dem aktuellen Niveau? Wenn ich dies tun:

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);
}

In ParseEntry ich versuchen, diese:

VGHL::String langName = stringTree.get<VGHL::String>(L"StringTable.Language");

Ergebnisse in einer Ausnahme (nicht existieren nicht). Ich habe dies auch versucht:

VGHL::String langName = stringTree.get<VGHL::String>(L"Language");

Die gleiche Problem.

Von meinem Verständnis, wenn ich rufe ParseEntry ich vorbei einen Verweis auf den Baum an diesem Knoten.

Gibt es eine Möglichkeit, dies zu beschäftigen, wenn ich mehrere Einträge von StringTable mit Eigenschaftsbaum habe?

War es hilfreich?

Lösung

erhält ParseEntry einen Verweis auf jede der untergeordneten Knoten des aktuellen Niveau. So können Sie nicht die Werte stellen die Knotennamen verwenden, weil Sie bereits einen untergeordneten Knoten haben. Der Knotenname wird gespeichert in v.first .

Sie können alle Elemente auf einer bestimmten Ebene iterieren mit get_child , um die Ebene zu wählen und dann BOOST_FOREACH zu wiederholen. Jeder Iterator wird ein Paar sein, den Namen des Knotens darstellt und die Knotendaten:

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;
}

Dieser Code drucken:

  

Name: Sprache, Wert: DE

     

Name: DataPath, Wert: .. \\ Daten \\ Ressourcen \\ Strings \\ stringtable.bst

Wenn Sie Iterierte nicht wollen, können Sie die Knotenebene wählen und suchen Sie dann nach den Knoten ihren Namen mit:

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;

Dieser Code drucken:

  

DE

     

.. \\ Daten \\ Ressourcen \\ Strings \\ stringtable.bst

Andere Tipps

Ich habe den Eigenschaftsbaum nicht verwendet, aber wahrscheinlich wird, wie es geschicktes aussieht. Ein paar schnellen Beobachtungen aber:

sollte nicht die Template-Parameter von Get das gleiche sein wie der Rückgabetyp?

VGHL :: String langName = stringTree.get (...);

Das ist aber höchstwahrscheinlich hier kein Problem, da diese in Kompilierzeitfehler ergeben hätten.

Nicht sicher, ob L "VGHL.StringTable.Language" Argument funktioniert?

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top