我正在尝试删除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] 删除。
我来说两句