How to delete specific nodes from an XElement?

后端 未结 6 404
时光取名叫无心
时光取名叫无心 2021-01-11 18:49

I have created a XElement with node which has XML as below.

I want to remove all the \"Rule\" nodes if they contain \"conditions\" node.

相关标签:
6条回答
  • 2021-01-11 19:07
    passiveLead.DataXml.Descendants("Conditions").Remove();
    
    0 讨论(0)
  • 2021-01-11 19:12

    You can try this approach:

    var nodes = xRelation.Elements().Where(x => x.Element("Conditions") != null).ToList();
    
    foreach(var node in nodes)
        node.Remove();
    

    Basic idea: you can't delete elements of collection you're currently iterating.
    So first you have to create list of nodes to delete and then delete these nodes.

    0 讨论(0)
  • 2021-01-11 19:12

    You can use Linq:

    xRelation.Elements()
         .Where(el => el.Elements("Conditions") == null)
         .Remove();
    

    Or create a copy of the nodes to delete, and delete them after (in case the first method doesn't work):

    List nodesToDelete = xRelation.Elements().Where(el => el.Elements("Conditions") == null).ToList();
    
    foreach (XElement el in nodesToDeletes)
    {
        // Removes from its parent, but not nodesToDelete, so we can use foreach here
        el.Remove();
    }
    
    0 讨论(0)
  • 2021-01-11 19:14

    I've made a small example for you:

    XDocument document = XDocument.Parse(GetXml());
    var rulesNode = document.Element("Rules");
    if (rulesNode != null)
    {
        rulesNode.Elements("Rule").Where(r => r.Element("Conditions") != null).Remove();
    }
    
    0 讨论(0)
  • 2021-01-11 19:16
    var el = xRelation.XPathSelectElement("/Rules/Rule/Conditions");
    while (el != null)
    {
          el.Remove();
          el = xRelation.XPathSelectElement("/Rules/Rule/Conditions");
    }
    
    0 讨论(0)
  • 2021-01-11 19:21

    just an idea:

    Reverse the Linq "condition" and You will get a List without "Rule" nodes

    0 讨论(0)
提交回复
热议问题