从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);),但它得到一个异常,它已经在使用。

我该怎么办?为什么会这样?

欢迎建设性的批评:)纠正我的问题中你想要的一切:)我希望它清楚了:)

从XML c#属性中删除Node

这是第二个代码中的问题:

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