我试图按摩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>
答案 0 :(得分:1)
快速简便的解决方案可能是向后迭代:
for (int i = node.childNodes().count() - 1; i >= 0; i--)
或者,如果您想要向前迭代,那么您应该在删除注释时随时减少i
。这将涉及重构您的代码。