如何删除C#4.0中指定的xmlnode的所有子节点?

这是我的xml。

   line1   line2     line1   line2    

我的C#代码是

 XmlDocument xd = new XmlDocument(); xd.Load(@"H:\Sample-8-final.xml"); XmlNodeList pnodelist = xd.GetElementsByTagName("page"); XmlNodeList xdChildNodeList = xd.ChildNodes; for (int i = 0; i < pnodelist.Count; i++) { XmlNode pageNode = pnodelist[i]; foreach (XmlNode xxNode in pageNode.ChildNodes) { if (xxNode.Name.ToString().Trim().Equals("Paragraph")) { foreach (XmlNode yyNode in xxNode.ChildNodes) { yyNode.ParentNode.RemoveChild(yyNode); } } } xd.Save(@"H:\Sample-8-final_1.xml"); 

我的必需输出是

               

但我的代码产生了错误的结果如下:

      line2       line2    

请指导我摆脱这个问题……

使用LINQ to XML删除Paragraph元素的所有后代:

 XElement root = XElement.Load(@"H:\Sample-8-final_1.xml"); root.Descendants("Paragraph").Descendants().Remove(); 

注意:您需要using System.Xml.Linq; 在文件的顶部。

代码没有问题,你只需要与你的文字完全一致。 它们区分大小写。 写“页面”而不是“PAGE”和“段落”而不是“PARAGRAPH”然后代码工作得很好。

Chris解释说,迭代失败是因为您在迭代该集合时修改了ChildNodes (通过删除它们)。 他建议使用RemoveAll()代替。 但RemoveAll()删除属性以及子元素,这不是我想要的。 所以这就是我写的在保留属性时安全地迭代(在VB.NET中):

 Private Shared Sub RemoveAllChildren(element As XmlElement) ' you can't iterate and delete in the same loop, because you would be modifying .ChildNodes Dim childrenList = New ArrayList() For Each child In element.ChildNodes childrenList.Add(child) Next For Each child In childrenList child.ParentNode.RemoveChild(child) Next End Sub 

问题是你正在改变你在这些方面迭代的东西:

 foreach (XmlNode yyNode in xxNode.ChildNodes) { yyNode.ParentNode.RemoveChild(yyNode); } 

如果你要用xxNode替换yyNode.ParentNode ,这更容易被xxNode (这保证是这样)。 这导致迭代器混淆并跳过一些你不想要它的东西。

虽然只是调用xxNode.RemoveAll()可能更容易。 请参阅docs: http : //msdn.microsoft.com/en-us/library/system.xml.xmlnode.removeall

但请注意,正如Mahen所说,这将删除您的属性,因此通常不是所需的解决方案(例如,不是在这种情况下)。