AngleSharp
HTMLパーサーを使用してノードを置換および削除し、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
これの問題は、再帰が間違っていることです。Length
for ループで説明されているよりも多くのノードが存在するため、すべての項目が再帰されるわけではありません。同様に、ノードを削除すると、リスト内で上に移動したノードがスキップされます。
再帰処理の結果として変更される可能性のあるツリーを再帰するにはどうすればよいですか? 唯一の方法は変更が加えられていないことを確認するまで、リストを何度も再帰していますか、それとも問題へのアプローチが間違っていますか?