【问题标题】:Removing all child node elements from XML in C#? [duplicate]从 C# 中的 XML 中删除所有子节点元素? [复制]
【发布时间】:2017-07-05 15:46:01
【问题描述】:

我有以下 XML 结构:

XML

<?xml version="1.0" encoding="utf-8" ?>
<Users>
</Users>

在某些时候,&lt;Users&gt; 会被不同的用户填满,但我希望能够在一个简单的函数中将它们全部删除。

尝试

/// <summary>
/// Removes all nodes from XML creds file on application close
/// </summary>
public static void RemoveXMLData()
{
    string xmlPath = Path.Combine(Environment.CurrentDirectory, @"Data\Credential.xml");
    XDocument document = XDocument.Load(xmlPath);
    document.RemoveNodes();
}

这似乎不起作用。我也做了以下事情:

尝试 #2

        string xmlPath = Path.Combine(Environment.CurrentDirectory, @"Data\Credential.xml");
        XDocument document = XDocument.Load(xmlPath);

        foreach (var node in document.Descendants("Users"))
        {
            node.Remove();
        }

但这会产生异常错误。

归根结底,我只想用以下文件数据回到第一格:

<?xml version="1.0" encoding="utf-8" ?>
<Users>
</Users>

【问题讨论】:

  • 只烤一个新鲜的? new XDocument(new XElement("Users"));
  • 您在发布问题之前尝试过搜索吗?检查this SO
  • Users 是 XML 中的唯一节点吗?如果是这样,您为什么不使用带有空用户节点的新 XDocument 来覆盖文件?
  • 您是否希望调用RemoveNodes() 将文件保存回磁盘?不清楚您所说的“似乎不起作用”是什么意思。
  • @JonSkeet 好的,好点。这通过调用 save 方法来修复它。谢谢

标签: c# xml visual-studio


【解决方案1】:

这应该可以正常工作:

XDocument document = XDocument.Load(xmlPath);
document.Descendants("Users").Elements().Remove();

正如@Cory 所建议的那样,另一种更快的方法是:

document.Root.Elements().Remove();

【讨论】:

  • 调用 .Save() 解决了我的问题,谢谢。
  • document.Root.Elements().Remove() 会更快,防止扫描整个树。 Descendants() 很少是您想要使用的方法。
  • 同意!根据您的建议更新了答案。
【解决方案2】:

当您迭代从中删除的集合时,它可能会在第二次尝试时崩溃。试试这个。

    string xmlPath = Path.Combine(Environment.CurrentDirectory, @"Data\Credential.xml");
    XDocument document = XDocument.Load(xmlPath);

    var nodes = document.Descendants("Users");
    while(nodes.Count > 0)
    {
        nodes[0].Remove();
    }

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-11-18
    • 2021-12-04
    • 1970-01-01
    • 2011-04-26
    • 2017-03-06
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多