有一个像这样的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
答案 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
,因此删除元素不会在下一次迭代中造成麻烦。