我正在尝试删除.xml中的所有节点。但是,使用以下代码,我只能删除第一个和第三个节点,从而无法删除第二个节点。我发现我的for循环出了问题,但是我无法确定出了什么问题。它似乎跳过了删除第二个节点。
有人可以帮忙吗?感谢。
malfunctions.xml:
<InjectedMalfunctions>
<Malfunction>
<Name>ABC1</Name>
<Time>00:00:00</Time>
</Malfunction>
<Malfunction>
<Name>ABC2</Name>
<Time>01:00:00</Time>
</Malfunction>
<Malfunction>
<Name>ABC3</Name>
<Time>03:00:00</Time>
</Malfunction>
</InjectedMalfunctions>
的.cpp:
QFile inFile("C:/Test/malfunctions.xml");
inFile.open(IODevice::ReadOnly | QIODevice::Text);
QDomDocument doc;
doc.setContent(&inFile);
inFile.close();
QDomNodeList nodes = doc.elementsbyTagName("Malfunction");
if(!nodes.isEmpty())
{
for(int i = 0; i < nodes.count(); ++i)
{
QDomNode node = nodes.at(i);
node.parentNode().removeChild(node);
}
}
...
结果:
<InjectedMalfunctions>
<Malfunction>
<Name>ABC2</Name>
<Time>01:00:00</Time>
</Malfunction>
</InjectedMalfunctions>
答案 0 :(得分:7)
QDomNodeList
是一个实时列表。
来自文档:The Document Object Model (DOM) requires these lists to be "live": whenever you change the underlying document, the contents of the list will get updated.
它会跳过第二个节点,因为您在i
变量中添加了1,同时删除了一个节点。
第一循环:
nodes[Node1, Node2, Node3]
i = 0
remove nodes[0] (Node1)
第二次循环:
nodes[Node2, Node3]
i = 1
remove nodes[1] (Node3)
在此之后你的循环结束。尝试创建一个while
循环来检查nodes
列表是否为空,并删除列表的第一个节点:
while(!nodes.isEmpty())
{
QDomNode node = nodes.at(0);
node.parentNode().removeChild(node);
}