Вызов различных функций обработки атрибутов в элементе XML

#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 каскад.
С другой стороны, вам не нужно будет создавать дополнительную функцию для каждого имени атрибута.