Как выбрать отдельные узлы XML - PullRequest
1 голос
/ 06 апреля 2010

Как получить список отдельных узлов в XML в c #

например

<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 Ответ

6 голосов
/ 06 апреля 2010

Различные способы сделать это; Muenchian группировка в xslt, например. Но в 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()) будет более ценным.

...