2012-08-06 48 views
0

我想使用元素索引從XML列表中刪除用戶選擇的元素。例如:如何通過索引從xml中刪除元素

foreach (int index in indexes) 
{ 
    Root.Descendants("book").ElementAt(index).Remove(); 
} 

但是這會拋出一個IndexOutOfRangeException。任何建議表示讚賞。

+2

當您刪除項目時,剩餘「書籍」元素(及其索引)的數量會發生變化。你可能在你的索引數組中有0,1,2,3,但是一旦你刪除了第一項,你的第四個索引(3)現在超出了範圍。你看到你的邏輯錯誤在哪裏? – 2012-08-06 19:12:14

+0

是的,謝謝,但我找不出解決方案。 – 2012-08-06 19:16:38

+1

如果索引是連續的順序,請嘗試反轉刪除它們的順序。 – 2012-08-06 19:18:40

回答

3

隨着您刪除項目,剩餘「書籍」元素(及其索引)的數量發生變化。您可能在索引數組中有0,1,2,3,但是一旦您刪除第一個項目,您的第四個索引(3)現在超出範圍。如果您的索引是連續的,則可以反轉刪除元素的順序,因此當前索引永遠不會「超出範圍」。

試試這個:

for (int i = indexes.Length - 1; i >= 0; i--) 
{ 
    Root.Descendants("book").ElementAt(indexes[i]).Remove(); 
}; 

不過,你提到要刪除「用戶選擇」的元素,所以我猜你的元素可能會以隨機順序。相反,你可能想嘗試這樣的事情:

IEnumerable<XElement> books = Root.Descendants("book"); 
IList<XElement> booksToRemove = new List<XElement>(indexes.Length); 

foreach (int index in indexes) 
{ 
    booksToRemove.Add(books.ElementAt(index)); 
} 

foreach (XElement book in booksToRemove) 
{ 
    book.Remove(); 
} 

現在你不必在意刪除它們之前元素或索引在什麼順序。