我刚开始使用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。 我知道这一定很简单,或者我错过了大局。
感谢您的帮助和时间!
答案 0 :(得分:2)
我不确定这是否会有所帮助,但这在the documentation:
中存在一个怪癖是节点和属性不拥有它们的文本 名称和价值观。这是因为通常它们只存储指针 源文本。因此,在为节点分配新名称或值时, 必须注意确保弦的正常使用寿命。该 实现它的最简单方法是从中分配字符串 xml_document内存池。在上面的例子中,这不是必需的, 因为我们只分配字符常量。但是下面的代码 使用memory_pool :: allocate_string()函数来分配节点名称 (将与文档具有相同的生命周期),并将其分配给 一个新节点。
我可以在你的代码中看到你的char数组x,y,z似乎是在你的循环范围内创建的,因此不满足上面的要求。