【问题标题】:How to delete all particular nodes from XML document in C#?如何从 C# 中的 XML 文档中删除所有特定节点?
【发布时间】:2016-11-28 00:06:41
【问题描述】:

我需要从 C# 中的 XML 文件中删除所有特定节点。 为此,我使用 Xpath 查询选择了所有节点并尝试了以下代码:

XmlNodeList nodeList = xml.SelectNodes("//Test");  
foreach (XmlNode node in nodeList)  
{
    node.ParentNode.RemoveChild(node);
}

QA 显示在执行上述代码后,XML 文件中仍然存在<Test> 节点。

我做错了什么?我应该如何从 XML 文档中删除所有指定的节点?

【问题讨论】:

    标签: c# xml xpath foreach


    【解决方案1】:

    我上面发布的代码说明了许多工程师的常见错误。我在一个严肃的企业后端中找到了带有foreach 的这段代码。

    我们应该记住:

    foreach 语句用于遍历集合得到 您想要的信息,但不能用于添加或删除 源集合中的项目以避免不可预知的副作用。 如果您需要在源集合中添加或删除项目,请使用 for 循环。 Read more about foreach on MSDN

    所以这段代码的正确版本:

    for (int i = 0; i < nodeList.Count; i++)  
    {
        nodeList[i].ParentNode.RemoveChild(nodeList[i]);
    }
    

    【讨论】:

    • 警告适用于更改正在迭代的集合,而您问题中的 foreach 循环永远不会这样做。看来您可能误解了问题的实际原因。也许您未能将更新的 XML 保存回文件? (单独调用 RemoveChild 不会将更改保存到磁盘。)
    • @kjhughes 为什么你确定RemoveChild 不会改变集合?为什么相同的代码可以在 for 上正常工作?
    • node.ParentNode.RemoveChild(node) 从其父级中删除 node;它不知道 node 会出现在 XPath 查询的结果中。
    • @kjhughes 视觉上是的。但从逻辑上讲,我们确实更改了nodelist
    • 这毫无意义。继续。祝你好运。
    猜你喜欢
    • 1970-01-01
    • 2022-08-19
    • 1970-01-01
    • 2016-11-05
    • 2020-01-15
    • 1970-01-01
    • 1970-01-01
    • 2022-11-16
    • 1970-01-01
    相关资源
    最近更新 更多