4

AngleSharpHTMLパーサーを使用してノードを置換および削除し、DOMツリーをトラバースしようとしています。この問題はこのライブラリに固有のものではなく、ツリーを再帰的に変更し、ツリー全体を確実に走査する方法に関する一般的な質問です。

このリスト を見てくださいmyCollection。ここで、各エントリはノード オブジェクトであり、子を持つ可能性があります。ライブ コレクションでもあります。

-A
-B
-C
 --D
 --E
 --F
-G

再帰関数でループを開始します。

private void LoopRecursively(Node element) {
   //either do nothing, remove, or replace with children
   //e.g. element.Replace(element.ChildNodes);
   for (var x = 0; x < element.ChildNodes.Length; x++) {
      LoopRecursively(element.ChildNodes[x]);

   }
}

Cノードをその子に置き換えることにしたとしましょう。したがって、リストは次のようになります。

-A
-B
-D
-E
-F
-G

これの問題は、再帰が間違っていることです。Lengthfor ループで説明されているよりも多くのノードが存在するため、すべての項目が再帰されるわけではありません。同様に、ノードを削除すると、リスト内で上に移動したノードがスキップされます。

再帰処理の結果として変更される可能性のあるツリーを再帰するにはどうすればよいですか? 唯一の方法は変更が加えられていないことを確認するまで、リストを何度も再帰していますか、それとも問題へのアプローチが間違っていますか?

4

2 に答える 2

1

安全な方法: 古いツリーを変更する代わりに、再帰関数を使用してまったく新しいツリーを作成し、古いツリーを新しいツリーに置き換えます。

安全性の低い方法: LoopRecursively 関数が追加または削除されたノードの数を表す整数を返すようにし、ループ変数をこの新しい数で更新します。(ループ インデックスとループ条件の変数の両方を更新します)

于 2015-08-13T19:05:26.457 に答える