我有一个xml文件,只想复制一些特定的节点:
发件人(示例(:
<1>
<2>
</2>
</1>
至:
<1>
<2>
</2>
<2>
</2>
</1>
我尝试了以下方法:
for(int i = 0; i < xmlRoot.childNodes().count(); i++) {
if(xmlRoot.childNodes().at(i).isElement()){
if(xmlRoot.childNodes().at(i).toElement().attribute("id") == "teamSection"){ //find goal element
teamNode = xmlRoot.childNodes().at(i).cloneNode(); //copy element
if(xmlRoot.childNodes().at(i).insertAfter(teamNode, xmlRoot.childNodes().at(i)).isNull()){
qDebug() << "not worked";
}
else{
qDebug() << "worked";
}
break;
}
}
}
但我想我误解了refChiled,因为我的解决方案只是返回null。(https://doc.qt.io/qt-5/qdomnode.html-insertAfter(。如何复制一个简单节点?
问题出在这行:
xmlRoot.childNodes().at(i).insertAfter(teamNode, xmlRoot.childNodes().at(i))
insertAfter
方法采用两个参数——新节点和将作为新节点插入引用的节点。但是,这两个参数都需要是调用insertAfter
的公共父级的子级。从模式上讲,您的代码类似于child->insertAfter(newChild, child)
,而它应该是parent->insertAfter(newChild, child)
。你可以看看下面的代码:
for (int i = 0; i < xmlRoot.childNodes().count(); i++)
{
if (xmlRoot.childNodes().at(i).isElement())
{
if(xmlRoot.childNodes().at(i).toElement().attribute("id") == "teamSection")
{
auto teamNode = xmlRoot.childNodes().at(i).cloneNode(); //copy element
auto sibling = xmlRoot.childNodes().at(i);
if (xmlRoot.insertAfter(teamNode, sibling).isNull())
{
qDebug() << "not worked";
}
else
{
qDebug() << "worked";
}
break;
}
}
}