#c #xml
#c #xml
Вопрос:
Как при обработке атрибутов XML в C должны выполняться разные операции для разных атрибутов?
В настоящее время у меня есть что-то вроде этого:
// get list of attributes for an XML element into member called 'attributes'
// ...
// run appropriate functions for each attribute
for (auto attribute : attributes)
{
auto name = attribute.name;
auto value = attribute.value;
if (name == "x")
doSomethingWithX(value);
else if (name == "y")
doSomethingWithY(value);
}
Для нескольких имен атрибутов это не так уж и плохо, но с большим числом (> 15) это начинает выглядеть беспорядочно, и меня беспокоят проблемы с производительностью.
Какой может быть лучший способ обработки подобных атрибутов XML?
Комментарии:
1. Вы могли бы использовать
std::map<std::string,std::function<void (const std::stringamp;)>>
альтернативный вариант.2. ^^^ или
std::unordered_map
, поскольку вы, вероятно, не могли меньше заботиться о лексикографическом упорядочении имен ключей.
Ответ №1:
Вы можете использовать a std::unordererd_map<std::string, std::function<void (const std::stringamp;)>>
и настроить его с помощью соответствующих лямбда-функций:
std::unordererd_map<std::string, std::function<void (const std::stringamp;)>> attrProcessors = {
{ "X", [](const std::stringamp; value) {
// Do something with value
} } } ,
{ "Y", [](const std::stringamp; value) {
// Do something with value
} } }
};
// run appropriate functions for each attribute
for (auto attribute : attributes)
{
auto name = attribute.name;
auto value = attribute.value;
auto processorEntry = attrProcessors.find(name);
if(processorEntry != attrProcessors.end()) {
(*processorEntry).second(value);
}
}
Однако я не уверен, что обслуживание записей карты будет легче читать, чем if / else if
каскад.
С другой стороны, вам не нужно будет создавать дополнительную функцию для каждого имени атрибута.