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();