2010-04-06 17 views
0

Comment prendre la liste des nœuds distincts en XML C#Comment sélectionner les noeuds XML distincts

par exemple

<root> 
<node1 ss="d1" ff="f1" gg="h1"/> 
<node1 ss="d1" ff="f2" gg="h1"/> 
<node1 ss="d1" ff="f1" gg="h1"/> 
<node1 ss="d2" ff="f1" gg="h1"/> 
<node1 ss="d1" ff="f1" gg="h1"/> 
<node1 ss="d1" ff="f1" gg="h1"/> 
<node1 ss="d2" ff="f1" gg="h1"/> 
<node1 ss="d1" ff="f2" gg="h1"/> 
</root> 

dans ce XML je prendrai noeud Distinguer et faire ce xml

<root> 
<node1 ss="d1" ff="f1" gg="h1"/> 
<node1 ss="d1" ff="f2" gg="h1"/> 
<node1 ss="d2" ff="f1" gg="h1"/> 
</root> 

ce xml est un échantillon pas réel et je cherche une solution en mode global pour toute struct en xml

+3

Vous devrez essayer d'expliquer un peu plus que cela. Pouvez-vous nous montrer ce que vous avez essayé, ou des exemples de données? –

+0

Votre noeud XML devrait se terminer par '/>' ou ''; comme vous le faites avec l'élément 'root'. –

Répondre

6

Différentes façons de faire cela; Groupement Muenchien en xslt par exemple. Mais en C#, si la mise en page XML est connu et fixe, serait peut-être le plus facile être:

 var root = XElement.Parse(xml); 
     var newRoot = new XElement("root", 
      root.Elements("node1").Select(el => 
      new { 
       ss = (string)el.Attribute("ss"), 
       ff = (string)el.Attribute("ff"), 
       gg = (string)el.Attribute("gg"), 
      }).Distinct().Select(obj => 
       new XElement("node1", 
        new XAttribute("ss", obj.ss), 
        new XAttribute("ff", obj.ff), 
        new XAttribute("gg", obj.gg)))); 

Si vous avez besoin quelque chose de plus souple, un IEqualityComparer<XElement> (pour une utilisation avec .Distinct()) serait plus utile.