2010-02-11 59 views
0

有一個這樣的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> 

我想刪除所有節點與價值=假 我寫了這樣一個遞歸函數,但它不是prooperly工作。

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 
+1

看起來不像一個有效的XML文件給我。 – Shoban 2010-02-11 05:32:21

+0

右鍵關閉最後一個「menuNode」標籤。 – AndiDog 2010-02-11 05:37:06

回答

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(); 
} 

的兩件事情需要注意上面 - 我使用的後裔()方法來避免必須執行遞歸潛水的XML樹。此外,我將集合轉換爲一個數組,該數組使用結果的「快照」,以便在查詢仍處於活動狀態時移除元素不會干擾XML結構。

+0

非常感謝 – 2010-02-11 07:00:19

0

永遠不要在迭代數組的同時刪除數組的元素,或採取適當的操作。在這種情況下,您應該從後向前遍歷MyMenuSource.Elements,因此刪除元素不會在您的下一次迭代中造成麻煩。