2012-07-09 85 views
0

我想从以下XMLLinq查询选择子节点

<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(); 

,但不能得到的价值从它,给我的价值包装在标签,而不是Distinct

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

回答

1

是有可能左右逢源

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(); 
+0

真棒,谢谢!没有意识到我可以直接去孩子,试图通过元素(“根”)链接到它。元素(“父母”) – 2012-07-09 08:51:10

+0

为什么你只用'.Select(c => c .Value)'会更简单吗?另请注意它是'Select',而不是'select'。 – 2012-07-09 09:19:50

+0

(我编辑过'select'到'Select',并且修正了'Descendants'和字符串文字的名字...我假设你不介意。我已经把lambda表达式留在了尴尬的地方语法的时刻,以防万一你真的想这样。) – 2012-07-09 09:21:56

2

你选择的元素,和元素是完全不同的。您需要获取不同的。例如:

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

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

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

......但你为什么?这是一个不太明确的国际海事组织。

请注意,如果你没有太在意根/父/子层级,并高兴地只得到所有child后代,你可以使用:

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

谢谢,会考虑到这一点,只想学习处事查询的方式。 – 2012-07-09 09:00:18

+0

oooh ..当下一个是Jon Skeet时,我接受了我的答案:) – 2012-07-09 09:06:29

+1

@SergejPopov:学习如何为上下文做适当的事情 - 不要强迫自己在没有帮助时使用查询表达式。这就像在你可以直接调用某些东西时强迫自己使用反射一样...... – 2012-07-09 09:20:46