我尝试使用RapidXML 1.13编辑节点的值,但未对.xml文件进行更改。
XML文件的简化版本如下所示:
<users>
<user>
<username>test</username>
<!-- This hazard line should change to "true" -->
<hazards>false</hazards>
<weather>false</weather>
</user>
</users>
字符串
我使用一个简单的for
搜索所有用户,当找到匹配的用户时,我选择我感兴趣的属性并尝试修改其内容。
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)
{
// Here's the problem
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; // Don't keep the for running
}
}
// Other edge cases...
}
型
这一行std::cout << settingNode->value() << std::endl;
打印“true”(正确的新值),但这一行rapidxml::print(std::cout, doc, 0);
打印的是旧的、未更改的XML文件。因此,该值似乎被修改了,但从未保存到doc
文件中。
我尝试创建一个节点的克隆,删除原来的并插入修改后的克隆,但出现了同样的问题:无法更改值。boolToChar()
函数是正确的,当尝试使用allocate_string()到新生成的节点时,完全相同的方法有效。
已编辑
发现问题:这行settingNode->value(doc.allocate_string(boolToChar(value)));
转换为settingNode->first_node()->value(doc.allocate_string(boolToChar(value)));
。据我所知,节点内的文本也被认为是节点,从而解释了first_node()
额外的调用。
1条答案
按热度按时间juud5qan1#
这是一个基于模板的解决方案。一个模板就可以完成这项工作。
在c++中,几乎没有可用于编译的库。
输入XML
字符串
价格1.0
型
输出XML
型