如何选择不同的xml节点

时间:2010-04-06 04:28:50

标签: c# xml xmlnode

如何在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

中的任何结构中寻找全局模式的解决方案

1 个答案:

答案 0 :(得分: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()一起使用)会更有价值。