从属性XML C#中删除节点

时间:2014-08-05 06:40:12

标签: c# xml

正如我在标题中所说,当我从属性中获取特定值时,我想删除节点。 (在这种情况下,从“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);)但它获得了一个已经在使用它的异常。

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

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

1 个答案:

答案 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