gpt4 book ai didi

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

转载 作者:数据小太阳 更新时间:2023-10-29 01:55:53 26 4
gpt4 key购买 nike

我正在尝试删除特定 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>) extension method :

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

关于c# - 使用 Linq 在 C# 中删除多个 XML 节点,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35742805/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com