Linq查询XML以选择子节点的多个元素

时间:2012-07-09 08:42:40

标签: c# xml linq

我想从以下xml

中选择所有不同的child值
<root>
  <parent>
    <child>value 1</child>
    <child>value 2</child>
  </parent>
  <parent>
    <child>value 1</child>
    <child>value 4</child>
  </parent>
</root>

我试过以下:

var vals  = (from res in XmlResources.Elements("root").Elements("parent") select res)
                                        .SelectMany(r => r.Elements("child")).Distinct().ToList();

但是无法从中获取价值,给我包含在标签中的价值而不是

是否有可能显示两种获取方式 - 查询和链接aka lambda。

2 个答案:

答案 0 :(得分:2)

是的,这两种方式都有可能

var doc = new XDocument("your xml string");
var values = (from c in doc.Root.Descendants("child") select c.Value).Distinct();

//链式样式

var values = doc.Root.Descendants("child").Select(c=>c.Value).Distinct();

答案 1 :(得分:2)

您正在选择元素,元素都是不同的。您需要获取不同的。例如:

var values = XmlResources.Element("root")
                         .Elements("parent")
                         .Elements("child")
                         .Select(x => x.Value)
                         .Distinct();

在这里使用查询表达式确实没有任何好处 - 它只会增加瑕疵。我只在查询具有多个方面时使用查询表达式(例如,其中是有意义的选择或连接)。对于只是一个选择只是一个,这是毫无意义的。所以是的,你可以使用:

var values = (from x in XmlResources.Element("root")
                                    .Elements("parent")
                                    .Elements("child")
              select x.Value).Distinct();

......但你为什么要这样?这是不太清楚的IMO。

请注意,如果您不太关心root / parent / child层次结构,并且很高兴只获得所有 child个后代,那么您可以使用:

var values = XmlResources.Descendants("child")
                         .Select(x => x.Value)
                         .Distinct();