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

Take a look at this http://rapidxml.sourceforge.net/manual.html#namespacerapidxml_1lifetime_of_source_text. With RapidXML, you basically have to ensure that any strings you write to the document persist for the lifetime of the document. In your code, you are assigning a temporary which will not exist after this call

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

try

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

and it should work for you. Take a look at this also with regards to outputting the resulting XML to a string http://rapidxml.sourceforge.net/manual.html#namespacerapidxml_1printing

于 2013-02-24T18:15:37.733 に答える