QDom以递归方式删除注释

时间:2014-09-23 16:28:34

标签: c++ xml qt recursion

我试图按摩QDomModel示例,以便在显示QTreeView中的内容之前从我的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>

1 个答案:

答案 0 :(得分:1)

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

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

或者,如果您想要向前迭代,那么您应该在删除注释时随时减少i。这将涉及重构您的代码。