我的递归函数无法正常工作

时间:2010-02-11 05:27:22

标签: vb.net

有一个像这样的xml文件。

<?xml version ="1.0" encoding ="utf-8"?>
    <menu>
          <menuNode title="Register" value="true">
            <menuNode  title="Company"  value="false">
              <menuNode title="Add" value="false" />
              <menuNode title="Modify" value="false" />
              <menuNode title="Delete" value="false" />
            </menuNode>
            <menuNode  title="SubCategory" value="true">
              <menuNode title="Add" value="false" />
              <menuNode title="Modify" value="false" />
              <menuNode title="Delete" value="false" />
            </menuNode>
          <menuNode>   
     </menu>

我想删除value = false的所有节点 我写了一个像这样的递归函数,但它没有正常工作。

Public Sub RemoveValueFalseNodes(ByVal MyMenuSource As XElement)
        For Each myMenuNode In MyMenuSource.Elements
            If myMenuNode.Elements.Count > 0 Then
                RemoveValueFalseNodes(myMenuNode)
            End If
            If myMenuNode.Attribute("value").Value = "false" Then
                myMenuNode.Remove()
            End If
        Next
    End Sub

2 个答案:

答案 0 :(得分:1)

在枚举时不应修改集合。通常情况下,当您尝试时它会抛出异常,但有时它只是搞砸了结果。相反,你应该考虑做类似下面的事情(抱歉c#,但我真的不知道VB.NET LINQ)

var nodes = from x in MyMenuSource.Descendants("menuNode")
            where !(bool)x.Attribute("value")
            select x;

foreach (var node in nodes.ToArray()) {
    node.Remove();
}

有关上述内容的两点注意事项 - 我正在使用Descendants()方法来避免必须对XML树进行递归跳转。此外,我正在将集合转换为一个数组,该数组采用结果的“快照”,以便在查询仍处于活动状态时删除元素不会干扰XML结构。

答案 1 :(得分:0)

迭代时不要删除数组元素,也不要采取适当的操作。在这种情况下,您应该简单地从后向前迭代MyMenuSource.Elements,因此删除元素不会在下一次迭代中造成麻烦。