QDom递归地删除注释

QDom recursively remove comments

本文关键字:注释 删除 递归 QDom      更新时间:2023-10-16

在QTreeView中显示内容之前,我正在尝试对QDomModel示例进行调整,以从DOM文档中删除注释/处理指令。我的想法是通过对子元素进行递归函数调用来实现这一点。当我运行下面的代码(实际上并没有调用remove)时,我会得到下面的输出,它会在所有节点上正确迭代。

void QDomModel::removeComments(QDomNode &node)
{
    QString name = node.nodeName();
    int i = node.nodeType();
    qDebug() << "Node : " << name << ", " << i;
    if (node.hasChildNodes())
    {
        // call remove comments recursively on all the child nodes
        for (int i=0; i<node.childNodes().count(); i++)
        {
            QDomNode child = node.childNodes().at(i);
            // Uh-oh, recursion!!
            removeComments(child);
        }
    }
    else
    {       
        // if the node has no children, check if it's a comment
        if (node.nodeType() == QDomNode::ProcessingInstructionNode ||
            node.nodeType() == QDomNode::CommentNode)
        {
            qDebug() << "deleting " << name;
            // if so, get rid of it.
            //node.parentNode().removeChild(node);
        }
    }
}

输出:

Node :  "#document" ,  9
Node :  "xml" ,  7
deleting  "xml"
Node :  "baseGuiConfig" ,  1
Node :  "defaults" ,  1
Node :  "dataDirectory" ,  1
Node :  "#text" ,  3
Node :  "dataFileExtension" ,  1
Node :  "#text" ,  3
Node :  "Just" ,  7
deleting  "Just"

然而,当我取消对removeChild调用的评论时,我会得到以下内容:

Node :  "#document" ,  9
Node :  "xml" ,  7
deleting  "xml"

很明显,当我删除xml节点时,baseGuiConfig节点变成了节点编号1,然后我在它上面递增。我知道我迭代子节点的方式是不正确的,因为我正在删除一些,我知道如何使用标准迭代器来修复这一问题,但我不确定如何使用QDom来解决这一问题。我应该以某种方式使用removeChild函数的返回值吗?

如果需要,这是我的XML文件:

<?xml version="1.0"?>
<baseGuiConfig xsi:noNamespaceSchemaLocation="baseGUIconfig.xsd" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
    <defaults>
        <dataDirectory>"C:"</dataDirectory>
        <dataFileExtension>".txt"</dataFileExtension>
        <?Just a useless comment?>
    </defaults>     
</baseGuiConfig>

一个快速简单的解决方案可能是向后迭代:

for (int i = node.childNodes().count() - 1; i >= 0; i--)

或者,如果要向前迭代,则应在删除注释时的任何时候递减i。不过,这需要对代码进行一些重组。