不明白属性的内存和 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<> doc 设为全局并添加parse_non_破坏性标志,但这些都没有影响。
如果重要的话,使用 Load 方法的客户端在同一个线程中运行。有什么问题?