تعزيز شجرة الممتلكات ومشاكل التحليل 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.
يمكنك التكرار على جميع العناصر على مستوى معين باستخدام 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" تعمل؟