Попытка добавить уникальные атрибуты 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);
}

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


person edition    schedule 14.06.2018    source источник


Ответы (1)


Это классическая ошибка из-за схемы владения строкой в ​​RapidXML.

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

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

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

document.allocate_attribute("id", allocate_string(std::to_string(index).c_str()))
person Roddy    schedule 23.06.2018