0

Rapidxml に問題があります。以下のコードで出力が得られます: http://pastebin.com/352MxuQY
しかし、ノードを追加しているループまたは「{}」を削除すると、適切な出力が得られます: http://pastebin.com/H0YQGwV1
なぜこれが起こっているのですか?

rapidxml::xml_document<> andDoc;

ifstream andfile(PATH+XMLNAME);
vector<char> buffer((istreambuf_iterator<char>(andfile)), istreambuf_iterator<char>( ));
buffer.push_back('\0');
cout<<&buffer[0]<<endl; 
andDoc.parse<0>(&buffer[0]); 
xml_node<>* cos = andDoc.first_node("Data")->first_node("Classifiers");
xml_node<>* klda = andDoc.first_node("Data")->first_node("Kldas");

for(int i=0;i<1;i++)
{

    rapidxml::xml_document<> doc;

    ifstream myfile(cPATH+"0\\c.xml");
    vector<char> buffer2((istreambuf_iterator<char>(myfile)), istreambuf_iterator<char>( ));
    buffer2.push_back('\0');
    cout<<&buffer2[0]<<endl; 
    doc.parse<0>(&buffer2[0]); 
    xml_node<>* cl = doc.first_node();
    xml_node<>* asd = doc.clone_node(cl);

    cos->append_node(asd);

    myfile.close();

}
std::ofstream file(PATH+XMLNAME);
if (file.is_open())
{
    file.clear();
    file << andDoc;
    file.close();
}
4

1 に答える 1

0

やや遅いですが、これが起こっていると私が思うことです。RapidXMLclone_nodeはあなたが思っているようには機能しません。

ドキュメントから、いくつかの追加の強調を加えて...


あらすじ

xml_node<Ch>* clone_node(const xml_node< Ch > *source, xml_node< Ch > *result=0);

説明

xml_nodeとその子ノードおよび属性の階層をクローン化します。ノードと属性は、このメモリプールから割り当てられます。名前と値は複製されません。複製とソースの間で共有されます。結果ノードは、オプションで2番目のパラメーターとして指定できます。その場合、その内容は複製されたソースノードに置き換えられます。これは、ドキュメント全体のクローンを作成する場合に便利です。


したがって、何が起こっているのかというと、forループの最後でxml_document'doc'がスコープ外になると、複製されたノードの名前と値がスコープ外になります(したがって失われます)。この制限を考えると、私は正直に使用clone_nodeが何であるかを見ることができません。

これを修正する最善の方法はわかりません。実際の要件によって異なりますが、最終的な出力が作成されるまで、すべてのソースドキュメントをスコープ内に保持する必要がある場合があります。

于 2012-06-20T18:49:59.350 に答える