我正在尝试遍历DOM树,使用AngleSharp和
HTML解析器替换和删除节点.这个问题并不是这个库独有的,而是一个关于如何递归地改变树并确保我仍在遍历整个树的一般问题.
取这个列表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
这个问题是递归是错误的.现在有比for循环中的Length更多的节点,因此并不是所有的项都会被递归.同样,删除节点意味着跳过列表中向上移动的节点.
如何递归由于递归处理而可能发生变化的树?
我一遍又一遍地递归我的列表,直到我确定没有任何改变是唯一的方法,或者我是否正确地接近了这个问题?
最佳答案 安全方式:使用递归函数创建一个全新的树而不是更改旧树,然后用新树替换旧树.
不太安全的方法:让LoopRecursively函数返回一个表示添加或删除的节点数的整数,然后用这个新数字更新循环变量. (更新循环索引和循环条件中的变量)