Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/282.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/linq/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何在包含特定元素值的元素之间删除特定元素_C#_Linq_Xpath_Xelement - Fatal编程技术网

C# 如何在包含特定元素值的元素之间删除特定元素

C# 如何在包含特定元素值的元素之间删除特定元素,c#,linq,xpath,xelement,C#,Linq,Xpath,Xelement,Xdocument Xd(从xml文件映射): 但是,我希望Xd受到影响…类似的功能应该可以工作: xd.Element("pfsense").Elements("nat").Elements("rule").Elements("descr").Where(x => x.Value == "delete this").Remove(); 一个简单朴素的解决方案将是 var elements = Xd.XPathSelectElements("/pfsense/nat//rule[desc

Xdocument Xd(从xml文件映射):


但是,我希望Xd受到影响…

类似的功能应该可以工作:

xd.Element("pfsense").Elements("nat").Elements("rule").Elements("descr").Where(x => x.Value == "delete this").Remove();

一个简单朴素的解决方案将是

var elements = Xd.XPathSelectElements("/pfsense/nat//rule[descr/text() = 'delete this']");
elements.Remove();

通过使用
Where
Any
类似:

Xd.Root.Element("nat").Elements("rule").Where
            (x => x.Elements("descr").Any(t => t.Value == ruleDescription)).Remove();
为了验证结果:

        Assert.IsFalse(Xd.Root.Element("nat").Elements
            ("rule").Any(x => x.Elements("descr").Any(t => t.Value == ruleDescription)));

这应该对你有用

正如您可能知道的,元素有一个级别。如果您想做这样的事情,最好使用后代。另一点需要注意的是“Equal”运算符的使用。您可以使用contains,但使用诸如“delete”和“donotdelete”之类的值太危险了。还要注意的是,即使您有CDATA,它们也不会出现在“值”中

刚刚注意到您想要删除“rule”元素。 因此,您可以像这样更改查询

   xdoc.Descendants().Where(d => d.Name.LocalName.Equals("rule") 
            && d.Descendants().Any(dd => dd.Name.LocalName.Equals("descr") && dd.Value.Equals("delete this"))).Remove();

什么是Xd?这是您的xml文件吗?Xd是Xdocument变量考虑映射到此Xd Xd文档的一个大xml文件,它可能有许多规则,最终将保存此文件。这听起来可能很愚蠢。但是我看到人们在做了这种更改后忘记保存文档。你保存了文档并查看了它是否被删除了吗?@KosalaW不是这样。我第一种方法的问题是,更改只在新创建的xelement变量中生效,而不是在实际的Xd文档中生效。再次检查答案和代码。看起来不错,但是如果没有规则元素或元素呢没有内部?此外,如果描述是描述,则只取一个元素并在其中进行检查。有许多规则。那又如何?通过将元素(“规则”)更改为元素(“规则”),可以很容易地适应规则的多样性。检查我编辑的代码。第二,如果没有规则元素或没有“descr”的元素,它基本上会被忽略。我尝试了这个元素,但它引发了一个错误…表达式必须计算为一个节点集。@GiannisGrivas,对我来说很好。
Xd.Root.Element("nat").Elements("rule").Where
            (x => x.Elements("descr").Any(t => t.Value == ruleDescription)).Remove();
        Assert.IsFalse(Xd.Root.Element("nat").Elements
            ("rule").Any(x => x.Elements("descr").Any(t => t.Value == ruleDescription)));
class Program
{
    static void Main(string[] args)
    {
        var xdoc = XDocument.Load(@"C:\Xd.xml");
        Console.WriteLine("--------------------");
        Console.WriteLine("BEFORE");
        Console.WriteLine("--------------------");
        Console.WriteLine(xdoc.ToString());
        xdoc.Descendants().Where(d => d.Name.LocalName.Equals("descr") && d.Value.Equals("delete this")).Remove();
        Console.WriteLine("");
        Console.WriteLine("");
        Console.WriteLine("--------------------");
        Console.WriteLine("AFTER");
        Console.WriteLine("--------------------");
        Console.WriteLine(xdoc.ToString());
        Console.ReadLine();
    }
}
   xdoc.Descendants().Where(d => d.Name.LocalName.Equals("rule") 
            && d.Descendants().Any(dd => dd.Name.LocalName.Equals("descr") && dd.Value.Equals("delete this"))).Remove();