5

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

然后它将起作用。

4

2 回答 2

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

于 2013-02-24T18:15:37.733 回答
0

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

< ?xml 版本=“1.0”编码=“UTF-8”?>

在输出文件中。

您必须使用例如类似的标志:

 doc.parse < trapidxml::parse_full | rapidxml::parse_no_data_nodes >(&xml_copy[0]);

然后它的工作。[CentOS7.2]

于 2016-04-02T06:18:15.950 回答