如何通过索引从xml中删除元素

时间:2012-08-06 19:08:35

标签: c# asp.net xml linq linq-to-xml

我想使用元素索引从XML列表中删除用户选择的元素。例如:

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

但这会引发IndexOutOfRangeException。任何建议都表示赞赏。

1 个答案:

答案 0 :(得分:4)

删除项目时,剩余“book”元素(及其索引)的数量会发生变化。索引数组中可能有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();
}

现在,在删除元素或索引之前,您不必关心它们的顺序。