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

有点晚了,但这是我认为正在发生的事情:RapidXML 的clone_node工作方式与您想象的不同。

从 docs中,有一些额外的强调......


概要

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

描述

克隆 xml_node 及其子节点和属性的层次结构。节点和属性是从这个内存池中分配的。名称和值不会被克隆,它们在克隆和源之间共享。结果节点可以选择指定为第二个参数,在这种情况下,它的内容将被克隆的源节点替换。当您想要克隆整个文档时,这很有用。


因此,发生的情况是,当 xml_document 'doc' 在 for 循环结束时超出范围时,克隆节点的名称和值超出范围(因此丢失)。鉴于此限制,我无法诚实地看到有什么用clone_node

我不确定如何最好地解决这个问题 - 这取决于您的实际需求,但您可能必须以某种方式将所有源文档保持在范围内,直到创建最终输出。

于 2012-06-20T18:49:59.350 回答