سؤال

أنا استخدم 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.

يمكنك التكرار على جميع العناصر على مستوى معين باستخدام get_child لتحديد المستوى ثم Boost_foreach لتكرار. سيكون كل تكرار زوجًا يمثل اسم العقدة وبيانات العقدة:

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

الاسم: datapath ، القيمة: .. بيانات الموارد سلاسل 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

نصائح أخرى

لم أستخدم شجرة الممتلكات ، ولكن ربما سأبدو أنيقة. بعض الملاحظات السريعة على الرغم من:

ألا ينبغي أن تكون معلمة القالب من الحصول على نوع الإرجاع؟

VGHL :: String langName = StringTree.get (...) ؛

ولكن على الأرجح ليس مشكلة هنا ، لأن هذا كان من شأنه أن يؤدي إلى خطأ في وقت الترجمة.

لست متأكدًا مما إذا كانت حجة L "VGHL.StringTable.Language" تعمل؟

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top