2010-02-11 14 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

+0

Вправо, закройте последний тег «menuNode». – AndiDog

ответ

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

Большое спасибо. –

0

Никогда не удаляйте элемент массива во время итерации по нему или предпринимайте правильные действия. В этом случае вам нужно просто перебрать MyMenuSource.Elements с обратной стороны, так что удаление элемента не вызывает проблем в следующей итерации.

Смежные вопросы