Попытка добавления уникальных атрибутов XML к узлам с использованием RapidXML

Я хочу добавить атрибуты к каждому узлу, найденному в корневом теге в итераторе, и я хочу, чтобы атрибут был idс присвоенными им индексами. Вот блок кода, используемый для итерации по дочерним узлам, распределения и добавления каждого атрибута к каждому узлу:

for (xml_node<>* node = root->first_node("lang")->first_node("strings")->first_node();
     node; node = node->next_sibling()) 
{
    node->append_attribute(
        document.allocate_attribute(
            "id", (std::to_string(index)).c_str()
            )
        );
    index += 1;
}

После проверки кажется, что document.allocate_attributeне создается новый указатель, как я ожидал, поскольку большинство idатрибутов в XML-представлении, созданных моей функцией print_document, показывают в основном повторяющиеся значения, то есть:

<translations>
    <lang>
        <strings>
        ...
        <s id="895">string1</s>
        <s id="895">string2</s>
        <s id="895">string3</s>
        ...
        </strings>
    </lang>
</translations>

print_document просто:

void print_document(xml_document<> &document)
{
    rapidxml::print(std::cout, document, 0);
}

Учитывая, что я не слишком озабочен использованием памяти, как я могу гарантировать, что каждое добавленное значение атрибута уникально?

c++,c++11,rapidxml,

0

Ответов: 1


0

Это классический споткнуться из-за строковой конструкции RapidXML.

Когда вы добавляете атрибут, RapidXML не создает копию строки атрибута - он просто сохраняет указатель, который затем выходит за пределы области видимости и часто используется повторно для следующего атрибута ...

Используйте, allocate_stringчтобы помочь вам.

Попробуй это:-

document.allocate_attribute("id", allocate_string(std::to_string(index).c_str()))
C ++ C ++ 11, rapidxml,
Похожие вопросы
Яндекс.Метрика