C ++ RapidXML - 编辑XML文件中的值

时间:2013-02-24 18:04:01

标签: c++ xml rapidxml

我最近开始使用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();

然后它会起作用。

2 个答案:

答案 0 :(得分:3)

看看这个http://rapidxml.sourceforge.net/manual.html#namespacerapidxml_1lifetime_of_source_text。使用RapidXML,您基本上必须确保写入文档的任何字符串在文档的生命周期内保持不变。在您的代码中,您将分配一个在此调用后不存在的临时文件

root_node->first_node("data")->value(std::string("Edited!").c_str());

std::string new_value = "Edited!";
root_node->first_node("data")->value(new_value.c_str());

它应该适合你。关于将结果XML输出到字符串http://rapidxml.sourceforge.net/manual.html#namespacerapidxml_1printing

,还要看一下

答案 1 :(得分:0)

解析标志 rapidxml :: parse_no_data_nodes 是不够的。缺少声明节点

&LT; ?xml version =“1.0”encoding =“UTF-8”? &GT;

在输出文件中。

你必须使用类似的标志:

contour_path = contour_.collections[0].get_paths()

然后它正在运作。 [CentOS7.2]