QDom删除节点

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)

thu*_*uga 8

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)