1

私は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を上書きします。私はそれが単純でなければならないことを知っているか、全体像を見逃しています。

あなたの助けと時間をありがとう!

4

1 に答える 1

2

これが役立つかどうかはわかりませんが、これはドキュメントにあります:

1つの癖は、ノードと属性がそれらの名前と値のテキストを所有していないことです。これは、通常、ソーステキストへのポインタのみを格納するためです。したがって、ノードに新しい名前または値を割り当てるときは、文字列の適切な存続期間を確保するように注意する必要があります。これを実現する最も簡単な方法は、xml_documentメモリプールから文字列を割り当てることです。上記の例では、文字定数のみを割り当てているため、これは必要ありません。ただし、以下のコードは、memory_pool :: alllocate_string()関数を使用してノード名(ドキュメントと同じ有効期間)を割り当て、それを新しいノードに割り当てます。

コードを見ると、char配列x、y、zがループのスコープ内で作成されているため、上記の要件を満たしていないことがわかります。

于 2012-06-16T00:26:20.353 に答える