删除XML中的元素

本文关键字:元素 XML 删除 | 更新日期: 2023-09-27 18:16:47

我尝试在Xml中删除一个元素,但目前我只是删除"子元素"XML:

<dependency>
<dependentAssembly dependencyType="preRequisite">
  </dependentAssembly>
</dependency>
<dependency>
<dependentAssembly dependencyType="install">
</dependentAssembly>

当前代码:

string filePath = "C:''Example''Example.exe.manifest"
var xml = XElement.Load(filePath);
xml.Descendants().Where(x => x.Name.LocalName == "dependentAssembly" && (string)x.Attribute("dependencyType") == "install").Remove();
xml.Save(filePath);

Xml后代码:

<dependency>
 <dependentAssembly dependencyType="preRequisite">
 </dependentAssembly>
</dependency>
<dependency>
</dependency>

正如你所看到的,我目前只是删除<dependentAssembly>,但我试图删除<dependency>

我该怎么做呢?

我从来没有在XML中做过那么多,所以我试着向你们学习:)

删除XML中的元素

两个选项。您可以选择要删除的父节点:

xml.Descendants()
   .Where(x => x.Name.LocalName == "dependentAssembly" && 
               (string)x.Attribute("dependencyType") == "install")
   .Select(x => x.Parent)
   .Remove();

或者您可以使用Any来查找具有此类子元素的元素:

xml.Descendants()
   .Where(p => p.Elements()
                .Any(x => x.Name.LocalName == "dependentAssembly" && 
                          (string)x.Attribute("dependencyType") == "install")))
   .Remove();

我还强烈建议不要用LocalName匹配,而是找出您想要的完整的名称空间限定元素名称,例如

XNamespace ns = "http://somenamespace";
xml.Descendants(ns + "dependency")
   .Where(p => p.Elements(ns + "dependentAssembly")
                .Any(x => (string)x.Attribute("dependencyType") == "install")))
   .Remove();

对于当前的语句,您只是选择了dependentAssembly和具有要安装的依赖属性的节点。您需要的是包含这样一个节点的父节点。因此,我建议将您的语句修改为:

xml.Descendants().Where(x => x.Name.LocalName == "dependentAssembly" && (string)x.Attribute("dependencyType") == "install").Select(x => x.Parent).Remove();

希望这能解决你的问题。

相关文章: