2017-03-16 38 views
0

XML子樹的最低我有一個需要使用的XDocument上的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> 

被起訴我試圖讓最小的子樹由選擇的節點例如屬性xml文檔98512000,98513300,98514000:

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

回答

1

鑑於所需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()); 

dotnetfiddle demo

OUTP ut:

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