如何删除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所说,这将删除您的属性,因此通常不是所需的解决方案(例如,不是在这种情况下)。