使用xerces-c删除不需要的节点

时间:2012-01-27 14:41:25

标签: c++ xerces xerces-c

我正在使用xerces 2.8.0。我想从文档中删除评论节点。

List = root->getChildNodes();
int count = List->getLength();
int i = 0;
while (i < count)
{
    DOMNode* node = List->item(i);
    if(node != 0 && node->getNodeType() == DOMNode::COMMENT_NODE)
    {
         cout<<"comment node found"<<endl;
         root->removeChild(node);
    }
    i++;
 }

如果我的输入具有以下格式,则此代码可以正常工作:

 <?xml version="1.0"?>
 <root><!-- comment --><node1>txt</node1></root>

但是如果输入文件具有如下所示的“漂亮”格式,则它不起作用:

 <?xml version="1.0"?>
 <root>
      <!-- comment -->
      <node1>txt</node1>
 </root>

谁能告诉我为什么?

1 个答案:

答案 0 :(得分:1)

我猜你的循环中有两件事没有按预期工作。

  1. 如果从父节点中删除子节点,则其余元素的位置也会发生变化。所以在这种情况下你不应该增加i以避免跳过下一个元素。

  2. 此外,当子元素的数量发生变化时,count变量的值实际上不再有效。这不是什么大问题,因为您在使用它之前检查node,但是您可能会在List-item(i) i之外调用{{1}}超出范围。此外,您可以保存一些调用,这会增加性能,特别是对于大文件,如果他们有很多评论。