0

私は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>

誰でも理由を教えてもらえますか?

4

1 に答える 1

1

あなたのループでは、2 つのことが期待どおりに機能していないと思います。

  1. 親から子ノードを削除すると、残りの要素の位置も変更されます。したがってi、次の要素をスキップしないようにするために、この場合は増加しないでください。

  2. また、子要素の数が変更されたため、count 変数の値は実際には無効になります。使用する前にチェックしているので、これは大したことではありませんが、範囲外でnode呼び出しList-item(i)ている可能性がiあります。さらに、いくつかの呼び出しを節約できます。これにより、特に大きなファイルに多くのコメントがある場合にパフォーマンスが向上します。

于 2012-01-29T15:15:00.753 に答える