2010-04-06 86 views
0

如何採取不同的節點列表中的XML在C#如何選擇不同的XML節點

例如

<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> 

在這個XML,我會採取不同的節點 ,使這個XML

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

這個xml是樣本不是真實的,我在全局模式下查找任何結構在xml中的解決方案

+3

你將不得不嘗試解釋多一點。你能告訴我們你試過的東西,或者一些示例數據嗎? – 2010-04-06 04:31:32

+0

您的xml節點應以'/>'或''結尾;就像你用'root'元素做的那樣。 – 2010-04-06 05:37:25

回答

6

你可以做到的各種方式;以xslt中的Muenchian分組爲例。但在C#中,如果XML佈局是已知的,固定的,也許最簡單的是:

 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)))); 

如果你需要的東西更靈活,一個IEqualityComparer<XElement>(用於.Distinct()使用)會更有價值。