Results 1 to 2 of 2

Thread: [RESOLVED] rapidxml - overwriting previous xml_nodes

  1. #1
    Hyperactive Member Darkened Linux's Avatar
    Join Date
    Jun 09
    Location
    Canada
    Posts
    296

    Resolved [RESOLVED] rapidxml - overwriting previous xml_nodes

    Hello,
    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.

    Code:
        <?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,

    Code:
        <?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,

    Code:
        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!
    [COLOR="Black"]

  2. #2
    Hyperactive Member Darkened Linux's Avatar
    Join Date
    Jun 09
    Location
    Canada
    Posts
    296

    Re: rapidxml - overwriting previous xml_nodes

    A little update,

    Someone told me that it holds the address of the var..

    I am not sure if this will help but this exists in the documentation at http://rapidxml.sourceforge.net/manu...inute_tutorial

    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
    So I changed my code up like so..

    Code:
        
    struct charStruct {
    	char X[10];
    	char Y[10];
    	char Z[10];
    };
    
    struct pathStruct {
        	float X[1000];
        	float Y[1000];
        	float Z[1000];
        
    	charStruct X2[1000];
    	charStruct Y2[1000];
    	charStruct Z2[1000];
        }
    Code:
    	for(int i = 0;i<3;i++)
    	{
    		xml_node<> *Point = doc.allocate_node(node_element, "Point");
    		GrindPath->append_node(Point);
    
    		FloatToCharA(toStore->X[i], toStore->X2[i].X);
    		Point->append_attribute(doc.allocate_attribute("X", toStore->X2[i].X));
        ....
        }

    And that fixed everything
    Last edited by Darkened Linux; Jun 16th, 2012 at 12:17 AM.
    [COLOR="Black"]

Posting Permissions

  • You may not post new threads
  • You may not post replies
  • You may not post attachments
  • You may not edit your posts
  •