我遇到了rapidxml的问题。下面的代码为我提供了输出:http://pastebin.com/352MxuQY
但是当我删除循环或“{}”时,Iam附加节点我得到了良好的输出: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();
}
答案 0 :(得分:0)
有点晚了,但这就是我认为发生的事情:RapidXML的clone_node
不会像你想象的那样发挥作用。
From the docs,有一些额外的重点......
<强>概要强>
xml_node<Ch>* clone_node(const xml_node< Ch > *source, xml_node< Ch > *result=0);
<强>描述强>
克隆xml_node及其子节点和属性的层次结构。节点和属性从此内存池中分配。 未克隆名称和值,它们在克隆和源之间共享。 可以选择将结果节点指定为第二个参数,在这种情况下,其内容将被替换克隆源节点。当您要克隆整个文档时,这非常有用。
所以,当xml_document'doc'在for循环结束时超出范围时,发生的事情是克隆节点的名称和值超出范围(并因此丢失)。鉴于此限制,我无法诚实地看到clone_node
的用途。
我不确定如何最好地解决这个问题 - 这取决于您的实际需求,但您可能必须以某种方式将所有源文档保留在范围内,直到创建最终输出。