QDom删除节点

时间:2014-02-12 07:20:16

标签: 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>

的.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>

1 个答案:

答案 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);
}