QDom递归地删除注释
QDom recursively remove comments
在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
。不过,这需要对代码进行一些重组。
相关文章:
- 将数组的地址分配给变量并删除
- 删除被注释掉的代码,而不是实际的赞美
- 从 txt 文件中删除注释
- 使用正则表达式从文件中删除行注释
- 提升信息解析器在读取/写入 INFO 格式文件时删除所有注释
- 为什么我的程序在删除以下代码中的注释后会出现运行时错误?
- 预处理一个自定义文本文件,以使用Boost Spirit删除注释
- 从代码中删除SAL注释是否安全
- 如何删除NetBeans中所有自动生成的注释
- 如何从代码中删除C样式注释
- 从 C++ 代码中删除注释,同时保留行号
- 是否有可靠的工具可以删除ASM/C/C++代码中的注释
- 在 C 中的程序开发期间删除注释
- 使用boost::regex删除C/C++风格的注释
- 尝试从用户C++输入的代码中删除注释
- QDom递归地删除注释
- 如何在解析文本C++时删除注释
- 从字符串中删除注释
- visual studio 2012-在C++中删除注释的程序不起作用
- 从c++字符串中删除注释