一次删除多个XML节点(RemoveChild())
1).(删除某一个指定的节点):
1 nodelist = xmldoc.SelectSingleNode("employees").ChildNodes; 2 foreach (XmlNode xn in nodelist) 3 { 4 //remove node by node's attribute 5 xmlele = (XmlElement)xn; 6 if (xmlele.GetAttribute("id") == "103") 7 { 8 xmln.RemoveChild(xn); 9 } 10 11 //remove node by node's name 12 if (xn.Name == "test") 13 { 14 xmln.RemoveChild(xn); 15 } 16 17 ////remove node by node's innertext 18 if (xn.FirstChild.InnerText.ToString().Contains("a")) 19 { 20 xmln.RemoveChild(xn); 21 } 22 }
这样只能删除找到的第一个与if语句相同的节点(node).但是如果我们想一次删除多个node的话,这样的结果就不是我们想要的了。
RemoveChild()方法修改childnodes List,并且使foreach失效,所以你需要中止循环后的第一个Remove。删除多个node,你必须使用一个Outer Loop(Break 它,如果没有删除的循环),或向后扫描列表:
2). Outer Loop:
1 while (true) 2 { 3 bool removed = false; 4 foreach (XmlNode xn in nodelist) 5 { 6 if (xn.FirstChild.InnerText.ToString().Contains("a")) 7 { 8 xn.ParentNode.RemoveChild(xn); 9 removed = true; 10 break; 11 } 12 } 13 14 if (!removed) 15 break; 16 }
3). 向后扫描列表:
1 for (int i = nodelist.Count - 1; i >= 0; i--) 2 { 3 xmln = nodelist[i]; 4 if (xmln.Name == "test") 5 xmln.ParentNode.RemoveChild(xmln); 6 7 //xmln=nodelist[i]; 8 //if (xmln.FirstChild.InnerText.ToString().Contains("a")) 9 // xmln.ParentNode.RemoveChild(xmln); 10 }
记得在最后要保存修改的:
xmldoc.Save(@"test.xml");