XDocument xml 上的最小子树
Minimum subtree on xml with XDocument
我有 xml 个文档需要使用 XDocument
<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>
我有 xml 个文档需要使用 XDocument
<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>