【问题标题】:rapidxml - overwriting previous xml_nodesrapidxml - 覆盖以前的 xml_nodes
【发布时间】:2012-06-19 01:19:31
【问题描述】:

我刚开始使用 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。 我知道它一定很简单,否则我错过了大局。

感谢您的帮助和时间!

【问题讨论】:

    标签: rapidxml


    【解决方案1】:

    我不确定这是否会有所帮助,但这存在于the documentation

    一个怪癖是节点和属性不拥有它们的文本 名称和值。这是因为通常它们只存储指向 源文本。因此,在为节点分配新名称或值时, 必须注意确保字符串的正确寿命。这 实现它的最简单方法是从 xml_document 内存池。在上面的示例中,这不是必需的, 因为我们只分配字符常量。但是下面的代码 使用 memory_pool::allocate_string() 函数分配节点名称 (它将与文档具有相同的生命周期),并将其分配给 一个新节点。

    我可以在您的代码中看到,您的 char 数组 x、y、z 似乎是在循环范围内创建的,因此不满足上述要求。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-09-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-10-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多