Почему мне нужно посчитать количество узлов Xml перед тем, как выполнить итерацию и удалить некоторые из них? - PullRequest
1 голос
/ 11 марта 2010

Мне кажется, я обнаружил странную ошибку, следующую:

Я хочу удалить первые два узла в XmlNodeList.

Я знаю, что могут быть другие способы сделать это (безусловно, есть), но это причина, по которой один из сегментов кода работает, а другой - нет (разница заключается в строке Count), что яинтересует.

var strXml = @"<food><fruit type=""apple""/><fruit type=""pear""/><fruit type=""banana""/></food>";
XmlDocument doc = new XmlDocument();
doc.LoadXml(strXml);

XmlNodeList nlFruit = doc.SelectNodes("food/fruit");
for(int i = 0; i < 2; i++)
{
    // This produces a null reference exception:
    nlFruit[i].ParentNode.RemoveChild(nlFruit[i]);
}

Однако, если я посчитаю количество узлов в XmlNodeList, это сработает, и у меня останется желаемый результат:

var strXml = @"<food><fruit type=""apple""/><fruit type=""pear""/><fruit type=""banana""/></food>";
XmlDocument doc = new XmlDocument();
doc.LoadXml(strXml);

XmlNodeList nlFruit = doc.SelectNodes("food/fruit");
// Count the nodes..
Debug.WriteLine(nlFruit.Count);
for(int i = 0; i < 2; i++)
{
    nlFruit[i].ParentNode.RemoveChild(nlFruit[i]);
}

// doc is now: <food><fruit type="banana" /></food>

Ответы [ 2 ]

0 голосов
/ 11 марта 2010

Может быть, это поможет:

Хэллоуин проблема: http://blogs.msdn.com/mikechampion/archive/2006/07/20/672208.aspx

0 голосов
/ 11 марта 2010

Оба не правы, вы должны удалить с конца

for(int i = 1; i >= 0; i--)
{
    nlFruit[i].ParentNode.RemoveChild(nlFruit[i]);
}

потому что вы удаляете 0-й элемент, а 1-й элемент становится 0-м, чем вы удаляете 1-й элемент, который является нулевым.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...