一次刪除多個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");

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM