使用Linq在C#中删除多个XML节点

比利·戴

我正在尝试删除element(path)包含特定值的多个节点,但是我得到了System.NullReferenceException任何帮助,如果我出错了,将不胜感激。

我的xml看起来像这样:

<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<ApplicationData Version="12.5.1" RootPath="FireFox-FILES">
  <RegistrySystem>
    <DIR Operation="+" Path="C:\Temp\Microsoft\MediaPlayer\ShimInclusionList" />
    <DIR Operation="+" Path="C:\Temp\MediaPlayer\ShimInclusionList\MM.EXE" />
    <DIR Operation="+" Path="C:\Temp\MediaPlayer\ShimInclusionList\plugin-container.exe" />
    <DIR Operation="+" Path="C:\Temp\Microsoft\MediaPlayer">
      <ENTRY Name="" Value="43.0.4" Type="1" />
      <ENTRY Name="CurrentVersion" Value="43.0.4 (x86 en-GB)" Type="1" />
    </DIR>
    <DIR Operation="+" Path="C:\Program Files\Microsoft\MediaPlayer\ShimInclusionList\plugin-container.exe" />
    <DIR Operation="+" Path="C:\Program Files\Microsoft\MediaPlayer\ShimInclusionList2\plugin.exe" />
    <DIR Operation="+" Path="C:\Program Files\Microsoft\MediaPlayer\ShimInclusionList2\container.exe" />
    <DIR Operation="+" Path="C:\Program Files\Microsoft\MediaPlayer\ShimInclusionList4">
      <ENTRY Name="" Value="43.0.4" Type="1" />
      <ENTRY Name="CurrentVersion" Value="43.0.4 (x86 en-GB)" Type="1" />
    </DIR>
  </RegistrySystem>
</ApplicationData>

我的代码如下所示:

XDocument xdoc = XDocument.Load(XmlFile);
foreach (var node in xdoc.Descendants("DIR").Where(status => status.Attribute("Path").Value.Contains(@"C:\Temp\")))
{
    node.Remove();

}
xdoc.Save(XmlFile);

我不确定我要去哪里。

乔恩·斯基特

我不确定为什么会收到异常,但是我强烈怀疑这是因为您在查询文档时正在修改文档。

如果您更改代码以使用ToList()调用来获取要删除的节点列表,则不会抛出:

foreach (var node in xdoc.Descendants("DIR")
           .Where(status => status.Attribute("Path").Value.Contains(@"C:\Temp\"))
           .ToList())
{                                                                            
    node.Remove();
}

但是,这不是最好的方法。最好的方法是使用Remove(this IEnumerable<XElement>)扩展方法

xdoc.Descendants("DIR")
    .Where(status => status.Attribute("Path").Value.Contains(@"C:\Temp\"))
    .Remove();

完全不需要foreach循环。现在,要使其在DIR没有Path属性元素面前更加健壮,可以将其强制转换为字符串:

xdoc.Descendants("DIR")
    .Where(status => ((string) status.Attribute("Path") ?? "").Contains(@"C:\Temp\"))
    .Remove();

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

无法使用linq to xml c#从xml文档中删除根节点

来自分类Dev

在C#中从StringBuilder删除XML节点

来自分类Dev

从xml中删除多个节点

来自分类Dev

使用linq从XML文档中删除“最近30天”节点

来自分类Dev

使用Linq解析出XML同级节点-C#

来自分类Dev

使用 LINQ c# 获取节点值 xml

来自分类Dev

如何使用C#从XML中删除相似的连续节点?

来自分类Dev

使用XMLReader在c#中解析XML以获取多个相似的节点

来自分类Dev

在具有多个相似节点的C#中读取XML

来自分类Dev

3尝试使用C#删除XML节点

来自分类Dev

从XML文件节点将根节点的多个节点的数据检索到C#中

来自分类Dev

c#检索多个XML子节点

来自分类Dev

使用C#中的XMLReader忽略XML中的父节点

来自分类Dev

如何使用C#在XML中添加父节点

来自分类Dev

如何使用C#更新XML中的节点值

来自分类Dev

C#删除XML父节点仍为空节点

来自分类Dev

在 C# 中使用 linq 从字典中删除重复的键

来自分类Dev

使用XSLT从XML中删除节点

来自分类Dev

使用 vbs 从 XML 中删除节点

来自分类Dev

在C#中动态从JSON删除节点

来自分类Dev

C#删除链表中的节点

来自分类Dev

如何删除linq to xml文档中的重复节点

来自分类Dev

如何使用LINQ删除具有属性的重复xml节点?

来自分类Dev

使用LINQ C#检查是否存在具有特定属性的XML节点

来自分类Dev

使用LINQ C#检查是否存在具有特定属性的XML节点

来自分类Dev

使用LINQ用XML在C#中创建对象

来自分类Dev

使用Linq to XML和C#从其他同名节点中选择一个节点

来自分类Dev

C# LINQ 在单次执行中从列表中删除多个对象

来自分类Dev

在C#中实时编辑xml。删除包含特定值的节点

Related 相关文章

热门标签

归档