2012-06-16 6 views
1

방금 ​​rapidxml을 사용하기 시작했습니다. 나는 첫째로 읽을 XML 파일을 만든다. 너무 빨리 일했습니다.rapidxml - 이전 xml_nodes 덮어 쓰기

이것은 제가 수동으로 작성한 것입니다.

<?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를 덮어 씁니다. 간단해야 함을 알고 있거나 큰 그림을 놓치고 있습니다.

도와 주셔서 감사합니다.

답변

2

난이 도움이 될 것입니다 확실하지 오전하지만이 the documentation에 존재 :

한 특질이 노드와 속성이 자신의 이름과 값의 텍스트를 소유하지 않은 것입니다. 일반적으로 그들은 소스 텍스트 에 대한 포인터 만 저장하기 때문입니다. 따라서 노드에 새 이름이나 값을 할당 할 때 문자열의 올바른 수명을 보장해야합니다. 가장 쉬운 방법은 xml_document 메모리 풀에서 문자열을 할당하는 것입니다. 위의 예에서는 문자 상수 만 지정하기 때문에 은 필요하지 않습니다. 그러나 아래의 코드는 memory_pool :: allocate_string() 함수를 사용하여 노드 이름 (문서와 수명이 동일 함)을 할당하고이를 새로운 노드 에 할당합니다.

여러분의 코드에서 x, y, z 문자 배열이 루프의 범위에서 만들어지고 위의 요구 사항을 충족하지 않는 것으로 보입니다.