使用RapidXML修改XML节点值未生效问题分析
RapidXML修改XML节点值不生效的问题与解决
我在使用RapidXML 1.13修改XML节点值时遇到问题:修改操作无法同步到.xml文件中。
简化的XML文件内容
<users> <user> <username>test</username> <!-- This hazard line should change to "true" --> <hazards>false</hazards> <weather>false</weather> </user> </users>
用于修改的C++代码
rapidxml::file<> xmlFile("users.xml"); rapidxml::xml_document<> doc; doc.parse<0>(xmlFile.data()); for (rapidxml::xml_node<>* userNode = doc.first_node("users")->first_node("user"); userNode; userNode = userNode->next_sibling("user")) { rapidxml::xml_node<>* usernameNode = userNode->first_node("username"); if (usernameNode && strcmp(usernameNode->value(), username) == 0) { rapidxml::xml_node<>* settingNode = userNode->first_node(setting.c_str()); if (settingNode) { // 问题出在这里 settingNode->value(doc.allocate_string(boolToChar(value))); std::ofstream outFile("users.xml"); outFile << doc; outFile.close(); std::cout << settingNode->value() << std::endl; rapidxml::print(std::cout, doc, 0); return; // 终止循环 } } // 其他边界情况处理... }
问题现象
执行代码后,std::cout << settingNode->value() << std::endl;能输出正确的新值"true",但rapidxml::print(std::cout, doc, 0);输出的仍是未修改的原始XML内容——看起来值改了,但实际没同步到文档对象中。我尝试过克隆节点、删除原节点再插入修改后的克隆节点,问题依然存在。boolToChar()函数功能正常,用同样的方法生成新节点时可以正常工作。
解决方法
问题根源在于RapidXML的节点结构:节点内的文本内容本身被视为一个子节点。因此需要修改代码中的赋值语句:
原代码:
settingNode->value(doc.allocate_string(boolToChar(value)));
修改为:
settingNode->first_node()->value(doc.allocate_string(boolToChar(value)));
通过调用first_node()获取到节点内的文本子节点后,再修改它的值,就能正确同步到文档对象中,最终输出和保存的XML都会显示修改后的内容。
内容的提问来源于stack exchange,提问作者Ary
相关产品推荐
相关产品推荐

