【问题标题】:removing unwanted nodes using xerces-c使用 xerces-c 删除不需要的节点
【发布时间】:2012-01-27 14:41:24
【问题描述】:

我正在使用 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>

谁能告诉我为什么?

【问题讨论】:

  • 即使是 xerces 的错误,这也是您可以轻松完成的事情。你不需要 xerces。
  • 对于一个大的 xml 文件,任何人都可以手动完成。我在我的项目中使用它。在最新版本的 xerces-c 中有什么解决方法吗??

标签: c++ xerces xerces-c


【解决方案1】:

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

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

  2. 此外,由于子元素的数量发生了变化,count 变量的值实际上不再有效。这没什么大不了的,因为您在使用它之前会检查node,但您可能会在i 超出范围的情况下调用List-item(i)。此外,您可以节省一些调用,这将提高性能,特别是对于具有大量 cmets 的大文件。

【讨论】:

  • 1.它甚至没有进入 if 循环至少一次(对于漂亮的格式),如果是这样我可以认为发生了跳过。
  • 我明白了,谢谢。如果节点被删除,我不应该增加 i。
  • @DineshReddy 欢迎您。现在,如果您接受我的回答并在上面打勾就好了:-)
猜你喜欢
  • 1970-01-01
  • 2011-03-08
  • 1970-01-01
  • 1970-01-01
  • 2019-09-29
  • 1970-01-01
  • 2022-10-05
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多