正如我在标题中所说,当我从属性中获取特定值时,我想删除节点。 (在这种情况下,从“dependencyType”属性中“安装”)
Xml文件:
<dependency>
<dependentAssembly dependencyType="preRequisite">
</dependentAssembly>
</dependency>
<dependency>
<dependentAssembly dependencyType="install">
</dependentAssembly>
</dependency>
看起来如何(在我经历之后):
<dependency>
<dependentAssembly dependencyType="preRequisite">
</dependentAssembly>
</dependency>
我想删除节点(在本例中为“依赖”,当我在属性“dependencytype”中获取值“install”)。
我尝试了两件事 第一个代码: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);
}
第一个问题出现在代码
中第二个问题是,如果我为foreach循环得到“elementsToDelete”并且它返回没有任何“elementsToDelete”,所以它跳过每个,所有这些,程序试图保存(xml.save(filepath);)但它获得了一个已经在使用它的异常。
我该怎么办? 为什么会那样?
建设性批评是欢迎:) 在我的问题中纠正你想要的每一个:) 我希望它清楚:))
答案 0 :(得分:2)
这是第二个代码中的问题:
XmlDocument doc = new XmlDocument();
doc.Load(filePath);
var xml = XElement.Load(File.OpenRead(filePath));
出于某种原因,您正在加载XML文档两次(然后忽略doc
) - 但是您要打开一个流({{ 1}})。将此代码更改为:
File.OpenRead
它应该没问题。您可以使用Remove
扩展方法简化其余代码:
var xml = XElement.Load(filePath);
请注意,如果该属性不存在(例如,如果您使用空引用调用它),则将xml.Descendants()
.Where(x => x.Name == "dependentAssembly" &&
(string) x.Attribute("dependencyType") == "install")
.Remove();
转换为XAttribute
只返回string
。
所以你的方法变成了:
null