我最近开始使用 RapidXML,解析值很好(我可以从元素内部获取数据),但我想编辑元素内部的值。
为了这个程序的目的,我想把它变成:
<?xml version="1.0" encoding="UTF-8"?>
<root>
<data>
This is data.
</data>
</root>
进入这个:
<?xml version="1.0" encoding="UTF-8"?>
<root>
<data>
Edited!
</data>
</root>
我在某处读到它rapidxml::xml_node
具有value()
更改元素内部值的功能,但它似乎不起作用。当我写出文件时,我得到了与以前完全相同的东西。这是我的代码:
std::string input_xml = loadFile(filename);
std::vector<char> xml_copy(input_xml.begin(), input_xml.end());
xml_copy.push_back('\0');
rapidxml::xml_document<> doc;
doc.parse<rapidxml::parse_declaration_node | rapidxml::parse_non_destructive>(&xml_copy[0]);
// Also tried with doc.parse<0>(&xml_copy[0]) but no luck
rapidxml::xml_node<>* root_node = doc.first_node("root");
root_node->first_node("data")->value(std::string("Edited!").c_str());
std::string data = std::string(xml_copy.begin(), xml_copy.end());
std::ofstream file;
file.open(filename.c_str());
file << data;
file.close();
有任何想法吗?
编辑:
结合接受的答案,该parse()
函数还需要具有rapidxml::parse_no_data_nodes
标志:
std::string input_xml = TileManager::getData(filename);
std::vector<char> xml_copy(input_xml.begin(), input_xml.end());
xml_copy.push_back('\0');
rapidxml::xml_document<> doc;
doc.parse<rapidxml::parse_no_data_nodes>(&xml_copy[0]); // Notice the flag here
rapidxml::xml_node<>* root_node = doc.first_node("root");
std::string s = "test";
const char * text = doc.allocate_string(s.c_str(), strlen(s.c_str()));
root_node->first_node("data")->value(text);
std::string data;
rapidxml::print(std::back_inserter(data), doc);
std::ofstream file;
file.open(filename.c_str());
file << data;
file.close();
然后它将起作用。