Welcome to OGeek Q&A Community for programmer and developer-Open, Learning and Share
Welcome To Ask or Share your Answers For Others

Categories

0 votes
208 views
in Technique[技术] by (71.8m points)

rapidxml - overwriting previous xml_nodes

I just started using rapidxml. I 1st create an xml file to read from. Worked so fast an easy.

This is what I manual crated.

<?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>

I could easy read that with no problems. I then wanted to write it to a new file. But the problem is that it keeps overwriting previous xml_nodes.

For example,

<?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>

This is the code that creates that xml file,

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;

};

My question his how to I stop it from overwriting previous xml_nodes? I have attempted many thing but every time its still overwrites previous xml_nodes. I know it must be simple or I am missing the big picture.

Thank you for your help and time!

See Question&Answers more detail:os

与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
Welcome To Ask or Share your Answers For Others

1 Reply

0 votes
by (71.8m points)

I am not sure if this will help but this exists in the documentation:

One quirk is that nodes and attributes do not own the text of their names and values. This is because normally they only store pointers to the source text. So, when assigning a new name or value to the node, care must be taken to ensure proper lifetime of the string. The easiest way to achieve it is to allocate the string from the xml_document memory pool. In the above example this is not necessary, because we are only assigning character constants. But the code below uses memory_pool::allocate_string() function to allocate node name (which will have the same lifetime as the document), and assigns it to a new node.

I can see in your code that it appears that your char arrays x, y, z are created in scope of your loop and as such do not satisfy the requirements above.


与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
OGeek|极客中国-欢迎来到极客的世界,一个免费开放的程序员编程交流平台!开放,进步,分享!让技术改变生活,让极客改变未来! Welcome to OGeek Q&A Community for programmer and developer-Open, Learning and Share
Click Here to Ask a Question

...