从XML c#属性中删除Node
本文关键字:删除 Node 属性 XML | 更新日期: 2023-09-27 18:16:39
正如我在标题中所说,当我从属性中获得特定值时,我想删除节点。(在本例中,"install"脱离了"dependencyType"属性)
Xml文件:<dependency>
<dependentAssembly dependencyType="preRequisite">
</dependentAssembly>
</dependency>
<dependency>
<dependentAssembly dependencyType="install">
</dependentAssembly>
</dependency>
它应该是什么样子(在我跑完之后):
<dependency>
<dependentAssembly dependencyType="preRequisite">
</dependentAssembly>
</dependency>
我想删除节点(在本例中,当我在属性"dependencytype"中获得值"install"时,为"dependency")。
我尝试了两件事代码1:
private void DeleteXmlPopulates()
{
string filepath = "C:'Example'Example.exe.manifest";
XmlDocument doc = new XmlDocument();
doc.Load(filePath);
using (XmlReader reader = XmlReader.Create(filePath))
{
while (reader.Read())
{
if (reader.Name == "dependency")
{
if (reader.GetAttribute("dependencyType") == "install")
{
//here i shall get the current Node-name and .Remove(); it
}
}
}
}
二代码: private void DeleteXmlPopulates()
{
string filepath = "C:'Example'Example.exe.manifest";
XmlDocument doc = new XmlDocument();
doc.Load(filePath);
var xml = XElement.Load(File.OpenRead(filePath));
var elementsToDelete = xml.Descendants().Where(x => x.Name == "dependentAssembly" && x.Attribute("dependencyType") != null && x.Attribute("dependencyType").Value == "install");
foreach (var xElement in elementsToDelete)
{
xElement.Remove();
}
xml.Save(filePath);
}
第一个问题在代码
中给出问题是在第二个是,如果我得到"elementsToDelete"的foreach-loop,它回来没有任何"elementsToDelete",所以它跳过每个,毕竟,程序试图保存(xml.save(filepath);),但它得到一个异常,它已经在使用。
我该怎么办?为什么会这样?
欢迎建设性的批评:)纠正我的问题中你想要的一切:)我希望它清楚了:)
这是第二个代码中的问题:
XmlDocument doc = new XmlDocument();
doc.Load(filePath);
var xml = XElement.Load(File.OpenRead(filePath));
由于某种原因,您在此加载了两次XML文档(然后忽略doc
) -但是您保留了一个打开的流(File.OpenRead
返回的流)。将此代码更改为:
var xml = XElement.Load(filePath);
应该没问题。您可以使用Remove
扩展方法简化其余的代码:
xml.Descendants()
.Where(x => x.Name == "dependentAssembly" &&
(string) x.Attribute("dependencyType") == "install")
.Remove();
注意,如果属性不存在,将XAttribute
转换为string
只返回null
(即,如果您使用空引用调用它)。
所以你的who方法变成:
private void DeleteXmlPopulates()
{
string filepath = "C:'Example'Example.exe.manifest";
var xml = XElement.Load(filePath);
xml.Descendants()
.Where(x => x.Name == "dependentAssembly" &&
(string) x.Attribute("dependencyType") == "install")
.Remove();
xml.Save(filePath);
}