1

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の構造体のグローバルモードでのソリューションを探しています

4

1 に答える 1

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()) の方が価値があります。

于 2010-04-06T05:19:11.023 に答える