2016-06-23 12 views
0

Ich habe eine Zeichenfolge wie untenRemove Duplicate von XDocument basierend auf Elementwert

<RuleGeneratorContextMenuXML> 
    <Contains>Principal Amount</Contains> 
    <NotContains /> 
    <Contains>Principal Amount</Contains> 
    <NotContains /> 
    <Contains>Interest Payment Date</Contains> 
    <NotContains /> 
    <Contains /> 
    <NotContains>Interest Payment Date</NotContains> 
    <Contains /> 
    <NotContains>Interest Payment Date</NotContains> 
    <Contains /> 
    <NotContains>Maturity falls</NotContains> 
</RuleGeneratorContextMenuXML> 

i XDocument verwendet es zu analysieren, wie

String keywords = "

<RuleGeneratorContextMenuXML> 
    <Contains>Principal Amount</Contains> 
    <NotContains /> 
    <Contains>Principal Amount</Contains> 
    <NotContains /> 
    <Contains>Interest Payment Date</Contains> 
    <NotContains /> 
    <Contains /> 
    <NotContains>Interest Payment Date</NotContains> 
    <Contains /> 
    <NotContains>Interest Payment Date</NotContains> 
    <Contains /> 
    <NotContains>Maturity falls</NotContains> 
</RuleGeneratorContextMenuXML> 

"

var x Dok = xDocument.Parse.Parse (Schlüsselwörter);

Vom x Doc möchte ich auf den Werten doppelte Elemente entfernen, basiert. so sollte mein Ergebnis x Doc sein als

<RuleGeneratorContextMenuXML> 
    <Keywords> 
     <Contains>Principal Amount</Contains> 
     <Contains>Interest Payment Date</Contains> 
     <NotContains>Interest Payment Date</NotContains> 
     <NotContains>Maturity falls</NotContains> 
    </Keywords> 
</RuleGeneratorContextMenuXML> 

Dies ist, was ich versuchte, so weit

for each (var node in xDoc. Descendants().Where(x => "Contains NotContains"     .Contains(x.Name.Local Name))) 
    { 
     if (node.Value == "") 
     { 
      node.Remove(); 
     } 
    } 

aber dies nicht erreichen, was ich genau will. Jede Hilfe wird sehr geschätzt.

+0

var Duplikate = (von req in xDoc.Descendants ("Keywords") Gruppe erf von req.Descendants ("enthält"). First(). Value in g wo g.Count()> 1 wählen g.Skip (1)). SelectMany (elements => elements); foreach (var Duplikat in Duplikaten) { duplicate.Remove(); } – Madhu

+0

Auch mit diesem versucht auch. Aber kein Ergebnis – Madhu

+0

Ihr boolescher Ausdruck macht einfach keinen Sinn. Ich bin nicht mit XML vertraut, aber warum filtern Sie nicht einfach Ihre Sammlung, indem Sie die Knoten mit übereinstimmenden Werten filtern? –

Antwort

0

Ihr Code in den Kommentaren in der Nähe. Sie müssen die Elemente eines bestimmten Namen von Wert-Gruppe, entweder dann alles, was sie leer sind im Fall entfernen oder alle, aber die erste in dem Fall, entfernen sie einen Wert haben:

doc.Descendants("Contains") 
    .GroupBy(x => x.Value)    
    .SelectMany(x => x.Key == string.Empty ? x : x.Skip(1)) 
    .Remove(); 

Sie können NotContains implementieren die gleiche Weg oder idealerweise Refaktor um die Duplizierung zu entfernen.

Siehe this fiddle für eine Demo.

+0

Großartig. Genau das, was ich wollte. Vielen Dank Charles – Madhu