我想从以下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。
答案 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();