2

不明白属性的内存和 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 方法的客户端在同一个线程中运行。有什么问题?

4

1 回答 1

3
std::vector<char> xmlCopy(bytes.begin(), bytes.end());

XML 文档的串行表示的本地副本是本地的。我敢打赌 rapidXML 不会复制属性,而是使用指向序列的指针。您可以通过查看属性值的地址和文档副本来检查这一点。

于 2011-12-28T17:59:46.170 回答