rapidxml - перезаписывает предыдущие xml_nodes
Я только начал использовать rapidxml. Сначала я создаю XML-файл для чтения. Работал так легко и просто.
Это то, что я написал вручную.
<?xml version="1.0" encoding="utf-8"?>
<GPS>
<Path>
<Point X="-3684.136" Y="3566.282" Z="285.2893" />
<Point X="-3681.816" Y="3540.431" Z="283.3658" />
<Point X="-3687.079" Y="3515.315" Z="282.6284" />
</Path>
</GPS>
Я мог легко прочитать это без проблем. Я тогда хотел написать это в новый файл. Но проблема в том, что он продолжает перезаписывать предыдущие xml_nodes.
Например,
<?xml version="1.0" encoding="UTF-8"?>
<GPS>
<Path>
<Point X="-3687.08" Y="3515.31" Z="282.628"/>
<Point X="-3687.08" Y="3515.31" Z="282.628"/>
<Point X="-3687.08" Y="3515.31" Z="282.628"/>
</Path>
</GPS>
Это код, который создает этот файл XML,
int Write(pathStruct *toStore)
{
xml_document<> doc;
xml_node<>* decl = doc.allocate_node(node_declaration);
decl->append_attribute(doc.allocate_attribute("version", "1.0"));
decl->append_attribute(doc.allocate_attribute("encoding", "UTF-8"));
doc.append_node(decl);
xml_node<> *GPS = doc.allocate_node(node_element, "GPS");
doc.append_node(GPS);
cout << "Saving GrindPath " << endl;
xml_node<> *Path = doc.allocate_node(node_element, "Path");
GPS->append_node(Path);
for(int i = 0;i<3;i++) //Temp Static
{
xml_node<> *Point = doc.allocate_node(node_element, "Point");
Path->append_node(Point);
char x[10];
FloatToCharA(toStore->X[i], x);
Point->append_attribute(doc.allocate_attribute("X", x));
char y[10];
FloatToCharA(toStore->Y[i], y);
Point->append_attribute(doc.allocate_attribute("Y", y));
char z[10];
FloatToCharA(toStore->Z[i], z);
Point->append_attribute(doc.allocate_attribute("Z", z));
//GrindPath->append_node(Point);
//doc.first_node()->append_node(GrindPath);
//Point = GrindPath->next_sibling();
cout << "x:" << toStore->X[i] << " y:" << toStore->Y[i] << " z:" << toStore->Z[i] << endl;
}
cout << "Done! " << endl;
std::ofstream myfile;
myfile.open ("./toStore.xml");
myfile << doc;
return 0;
};
Мой вопрос, как мне остановить перезапись предыдущих xml_nodes? Я пытался многое, но каждый раз он все еще перезаписывает предыдущие xml_nodes. Я знаю, что это должно быть просто, или мне не хватает общей картины.
Спасибо за вашу помощь и время!
1 ответ
Я не уверен, поможет ли это, но это есть в документации:
Одна из странностей заключается в том, что узлам и атрибутам не принадлежит текст их имен и значений. Это потому, что обычно они хранят только указатели на исходный текст. Таким образом, при назначении нового имени или значения узлу необходимо позаботиться о том, чтобы обеспечить правильное время жизни строки. Самый простой способ добиться этого - выделить строку из пула памяти xml_document. В приведенном выше примере это не обязательно, потому что мы назначаем только символьные константы. Но приведенный ниже код использует функцию memory_pool::allocate_string() для выделения имени узла (которое будет иметь то же время жизни, что и документ), и присваивает его новому узлу.
Я вижу в вашем коде, что кажется, что ваши массивы символов x, y, z созданы в области действия вашего цикла и, как таковые, не удовлетворяют вышеуказанным требованиям.