Wal*_*ace 1 c++ xml qt dom for-loop
我试图删除我的.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>
Run Code Online (Sandbox Code Playgroud)
的.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);
}
}
...
Run Code Online (Sandbox Code Playgroud)
结果:
<InjectedMalfunctions>
<Malfunction>
<Name>ABC2</Name>
<Time>01:00:00</Time>
</Malfunction>
</InjectedMalfunctions>
Run Code Online (Sandbox Code Playgroud)
QDomNodeList是一个实时列表.从文档:文档对象模型(DOM)要求这些列表"实时":每当您更改基础文档时,列表的内容都将更新.
它会跳过第二个节点,因为您向i变量添加1 ,同时删除节点.
第一循环:
nodes[Node1, Node2, Node3]
i = 0
remove nodes[0] (Node1)
Run Code Online (Sandbox Code Playgroud)
第二循环:
nodes[Node2, Node3]
i = 1
remove nodes[1] (Node3)
Run Code Online (Sandbox Code Playgroud)
在此之后你的循环结束.尝试创建一个while循环来检查nodes列表是否为空,并删除列表的第一个节点:
while(!nodes.isEmpty())
{
QDomNode node = nodes.at(0);
node.parentNode().removeChild(node);
}
Run Code Online (Sandbox Code Playgroud)