不明白属性的内存和rapidXML是怎么回事。 函数封装了xml解析,如果成功,则返回对根节点的引用,当在此函数中调用遍历DOM树时,我得到存储在xml文件中的正确数据。
typedef rapidxml::xml_node<>* Node;
...
Node Load()
{
Node pRootNode = NULL;
// read file stream in bytes
...
std::vector<char> xmlCopy(bytes.begin(), bytes.end());
xmlCopy.push_back('\0');
rapidxml::xml_document<> doc;
try
{
doc.parse<rapidxml::parse_declaration_node | rapidxml::parse_no_data_nodes>(&bytes[0]);
pRootNode = doc.first_node();
...
TraverseDOMTree(pRootNode);
}
return pRootNode;
}
TraverseDOMTree按预期打印所有属性和节点名称。
后来,显然在Load的范围之外,pRootNode将用于从DOM中查询值三,这不起作用。 出于测试目的,调用完美工作的TraverseDOMTree,现在打印属性的垃圾值。我可以假设DOM树仍然存在,节点的层次结构与第一次调用相同,但属性值混乱。 我尝试制作 rapidxml :: xml_document&lt;&gt; doc 全局以及添加 parse_non_destructive 标志,这些都不会产生任何影响。
如果很重要,使用Load方法的客户端在同一个线程中运行。什么可能是错的?
答案 0 :(得分:3)
std::vector<char> xmlCopy(bytes.begin(), bytes.end());
XML文档的序列表示的本地副本是本地的。我敢打赌,rapidXML不会复制属性,而是使用指向序列的指针。您可以通过查看属性值的地址和文档副本来检查它。