Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/299.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/0/xml/12.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# 带XDocument的xml上的最小子树_C#_Xml_Linq To Xml_Spanning Tree - Fatal编程技术网

C# 带XDocument的xml上的最小子树

C# 带XDocument的xml上的最小子树,c#,xml,linq-to-xml,spanning-tree,C#,Xml,Linq To Xml,Spanning Tree,我有需要使用XDocument处理的xml文档 <elem c="98500000"> <elem c="98510000"> <elem c="98511000"/> <elem c="98512000"/> <elem c="98513000"> <elem c="98513100"/> <elem c="98513200"/>

我有需要使用XDocument处理的xml文档

<elem c="98500000">
    <elem c="98510000">
      <elem c="98511000"/>
      <elem c="98512000"/>
      <elem c="98513000">
        <elem c="98513100"/>
        <elem c="98513200"/>
        <elem c="98513300"/>
        <elem c="98513310"/>
      </elem>
      <elem c="98514000"/>
    </elem>
  </elem>

我尝试通过所选节点属性获取最小子树,例如98512000、98513300、98514000:

<elem c="98500000">
    <elem c="98510000">
      <elem c="98512000"/>
      <elem c="98513000">
        <elem c="98513300"/>
      </elem>
      <elem c="98514000"/>
    </elem>
  </elem>

给定所需的
c
值列表,您可以删除
c
属性值不在列表中且列表中没有子元素具有
c
属性值的元素:

var doc = XDocument.Parse("your XML document string here");
var list = new List<string>(){"98512000", "98513300", "98514000"};
doc.Descendants()
    // all `c` value doesn't match current element's `c` attribute value
   .Where(o => list.All(c => (string)o.Attribute("c") != c) 
                    && 
    // and all descendant elements doesn't have matching `c` attribute value
               o.Descendants().All(d => !list.Any(c => (string)d.Attribute("c") == c)))
   .Remove();
Console.WriteLine(doc.ToString());
<elem c="98500000">
  <elem c="98510000">
    <elem c="98512000" />
    <elem c="98513000">
      <elem c="98513300" />
    </elem>
    <elem c="98514000" />
  </elem>
</elem>