【问题标题】:How to select distinct xml nodes如何选择不同的 xml 节点
【发布时间】:2010-04-06 04:28:50
【问题描述】:

如何在 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 中的任何结构寻找解决方案

【问题讨论】:

  • 您将不得不尝试解释更多。你能告诉我们你尝试了什么,或者一些示例数据吗?
  • 您的 xml 节点应该以 /&gt;&lt;/node1&gt; 结尾;就像你对 root 元素所做的那样。

标签: c# xml xmlnode


【解决方案1】:

您可以通过多种方式做到这一点;例如 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&lt;XElement&gt;(与.Distinct() 一起使用)会更有价值。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-03-14
    相关资源
    最近更新 更多