如何在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>
Run Code Online (Sandbox Code Playgroud)
在这个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>
Run Code Online (Sandbox Code Playgroud)
这个xml是不真实的样本,我在全局模式下为xml中的任何结构寻找解决方案
你可以采取各种方式; 例如,在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))));
Run Code Online (Sandbox Code Playgroud)
如果你需要更灵活的东西,IEqualityComparer<XElement>(用于.Distinct())会更有价值.