【问题标题】:Delete specific Parent and and it's children in XML [duplicate]删除特定的父级及其在 XML 中的子级 [重复]
【发布时间】:2012-10-12 01:24:43
【问题描述】:

可能重复:
How to delete xml element with C#?

假设我有一个这样的 XML 文档:

<doc>
     <car>
         <color>Red</color>
         <size>compact</size>
     </car>
     <car>
         <color>Yellow</color>
         <size>mid-size</size>
     </car>
</doc>

我想删除属性为yellow的car的整个条目,所以xml文件就变成了

<doc>
     <car>
         <color>red</color>
         <size>compact</size>
     </car>
</doc>

我该怎么做呢?我搜索了高低并找到了解决方案,但遗憾的是不是 c#。

【问题讨论】:

  • 您搜索此特定节点的标准是什么?
  • 你真的搜索过吗?您的答案几乎可以通过“C# xml delete”在谷歌的第一个链接中找到
  • 节点的所有属性都是已知的。在我的例子中,它是一个 ID 号和一个 DateTime 对象。所以我想我会使用分配给它的 ID 号来搜索节点。

标签: c# xml parent children


【解决方案1】:

您可以使用 Linq to XML:

  var yellowCars = from car in xDoc.Elements("doc").Elements("car") 
                     where car.Element("Color").Value == "Yellow" 
                     select car;

    foreach (var car in yellowCars)
    {
        car.Remove();
    }

  xDoc.Save();

【讨论】:

    【解决方案2】:

    我总是如何处理这种情况:我将整个文件加载到内存中,您可以通过将 xml 反序列化为 c# 类或 xmlnode 结构来做到这一点,这方面有很多教程。后记我对列表或数组进行任何编辑,然后重新序列化并覆盖整个文件。如果您的文件没有数百条记录,则应该没有明显的性能问题

    【讨论】:

    • 除非这些记录是巨大的,否则即使是“很多”也可能不是很多。与 DOM 解析相比,IO 更可能成为性能瓶颈,甚至流式 API 也必须顺序读取整个文件,然后将其写出。它们的优势是在处理文档时,如果不分页工作集的其余部分就无法缓冲。
    • 如果您的实际数据与您的示例一样简单,那么下面的答案会更好。我的数据相当复杂,所以在可序列化类中操作比使用 xml 语法更容易
    【解决方案3】:
    using System.Xml.XPath;
    

    ...

    var doc = XDocument.Parse(xml);
    var list = new List<XElement>();
    foreach (var element in doc.XPathSelectElements(@"/doc/car[color='Yellow']")) {
        list.Add(element);
    }
    foreach (var element in list) element.Remove();
    

    更新:所以它在迭代时不会改变集合。

    【讨论】:

    • 通常在foreach 循环中调用Remove 会导致异常,XPathSelectElements 不是这种情况吗?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-12-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-11-07
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多