C# 删除特定的父项和它';XML中的子对象

C# 删除特定的父项和它';XML中的子对象,c#,xml,parent,children,C#,Xml,Parent,Children,可能重复: 假设我有这样一个XML文档: <doc> <car> <color>Red</color> <size>compact</size> </car> <car> <color>Yellow</color> <size>mid-size</size&

可能重复:

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

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

红色
契约
黄色的
中型
我想删除属性为黄色的car的整个条目,因此xml文件变成

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

红色
契约

我该怎么办?我到处搜索,找到了解决方案,但遗憾的是没有找到c#。我总是如何处理这种情况:我将整个文件加载到内存中,您可以通过将xml反序列化到c#类或xmlnode结构来实现这一点,这方面有很多教程。之后,我对列表或数组进行任何编辑,然后重新序列化并覆盖整个文件。如果您的文件没有数百条记录,则不会出现明显的性能问题

using System.Xml.XPath;

var doc=XDocument.Parse(xml);
var list=新列表();
foreach(doc.XPathSelectElements(@“/doc/car[color='Yellow'])中的var元素){
列表。添加(元素);
}
foreach(列表中的var元素)元素。Remove();

更新:因此它在迭代集合时不会更改集合。

您可以使用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();

您搜索此特定节点的条件是什么?您真的搜索了吗?你的答案几乎可以通过谷歌的第一个链接“C#xml delete”找到,该节点的所有属性都是已知的。在我的例子中,它是一个ID号和一个DateTime对象。因此,我假设我只使用分配给它的ID号来搜索节点。通常在
foreach
循环中调用
Remove
会导致异常,而
XPathSelectElements
不是这样吗?除非这些记录非常庞大,否则即使是“许多huddle”也可能不是很多。与DOM解析相比,IO更可能成为性能瓶颈,甚至流式API也必须顺序读取整个文件,然后将其写出。它们的优点是,在处理无法缓冲的文档时,不分页其余的工作集。如果您的实际数据与示例一样简单,那么下面的答案会更好。我的数据相当复杂,因此在可序列化类中比使用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();