尝试使用 RapidXML 将独特的 XML 属性附加到节点

Trying to append unique XML attributes to nodes using 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 似乎没有像我预期的那样创建新指针,因为 XML 输出中的大多数 id 属性由我的函数 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);
}

鉴于我不太关心内存使用情况,如何确保每个附加的属性值都是唯一的?

由于 RapidXML 的字符串所有权设计,这是一个典型的错误。

当您添加属性时,RapidXML 不会复制属性字符串 - 它只是存储指针,然后超出范围并经常被下一个属性重用...

使用allocate_string来帮助你。

试试这个:-

document.allocate_attribute("id", allocate_string(std::to_string(index).c_str()))