尝试使用 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()))
我想将属性附加到在迭代器的根标记中找到的每个节点,并且我希望属性是 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()))