从XDocument中删除节点

时间:2010-07-09 18:24:27

标签: c# xml linq

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

        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中删除嵌套的子项吗?

谢谢!

3 个答案:

答案 0 :(得分:19)

显然,当您对element.Elements()进行迭代时,在其中一个子项上调用Remove()会导致枚举数为yield break。迭代element.Elements().ToList()解决了问题。

答案 1 :(得分:2)

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

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

答案 2 :(得分:2)

使用XDocument时请尝试此操作:

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

此致 托德