You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.03 10:17:33