开发者

Why do I need to count the number of XmlNodes before iterating through and deleting some of them?

开发者 https://www.devze.com 2022-12-22 11:18 出处:网络
I believe I have found a weird bug as follow: I want to delete the first two nodes in an XmlNodeList.

I believe I have found a weird bug as follow:

I want to delete the first two nodes in an XmlNodeList.

I know that there may be other ways of doing this (there surely are) but it is the reason why one of the code segments works and one doesn't (the difference being the Count line) that I am interested in.

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

However, if I count the number of nodes in the XmlNodeList it works and I am left with the desired outcome:

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>


Both are wrong you should delete from the end

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

because you remove the 0 th element, and 1 st element becomes the 0 th, than you removes 1st element which is null.


May be this will help:

Halloween Problem : http://blogs.msdn.com/mikechampion/archive/2006/07/20/672208.aspx

0

精彩评论

暂无评论...
验证码 换一张
取 消

关注公众号