从XDocument中删除节点

这将删除文档中的所有元素:

XDocument document = XDocument.Load(inputFile); foreach (XElement element in document.Elements()) { element.Remove(); } document.Save(outputFile); 

这没有任何影响:

  XDocument document = XDocument.Load(inputFile); foreach (XElement element in document.Elements()) { //element.Remove(); foreach (XElement child in element.Elements()) child.Remove(); } document.Save(outputFile); 

我在这里错过了什么吗? 由于这些都是对XDocument中元素的引用,因此更改是否应该生效? 我还有其他方法可以从XDocument中删除嵌套的子项吗?

谢谢!

显然,当你遍历element.Elements() ,在其中一个子element.Elements()调用Remove()会导致枚举器yield break 。 迭代element.Elements().ToList()修复了问题。

下面是使用System.Xml.XPath的另一种方法示例(更改xpath查询以满足您的需要):

 const string xml = @"   arkansas california virginia   "; XDocument doc = XDocument.Parse(xml); doc.XPathSelectElements("//xml/country/states/state[.='arkansas']").ToList() .ForEach(el => el.Remove());; Console.WriteLine(doc.ToString()); Console.ReadKey(true); 

使用XDocument尝试以下方法:

 XDocument document = XDocument.Load(inputFile); foreach (XElement element in document.Elements()) { document.Element("Root").SetElementValue(element , null); } document.Save(outputFile) 

此致,托德