如何使用LINQ在XML中按名称获取多个元素

时间:2014-04-22 05:56:34

标签: c# xml linq

我是以下的XML:

<?xml version="1.0" standalone="yes"?>
<TestSuite>
  <TestCase Name="XXX" ID="123;234; 345; 456">
    <CodeBlock />
  </TestCase>
  <TestCase Name="East" ID="11,22,33, 44, 55">
    <CodeBlock />
  </TestCase>
</TestSuite>         

我需要获取所有ID并通过ID ASC订购,下面是我的Linq:

var r = (from lv1 in xdoc.Descendants("TestCase")
         select new { ID = lv1.Attribute("ID").Value })
        .Where(d => d.ID != string.Empty)
        .GroupBy(l => l.ID)
        .ToList();

我现在得到:

123;234; 345; 456
11,22,33, 44, 55

但我怎样才能获得ID:

11
22
33
44
55
123
234
345
456

2 个答案:

答案 0 :(得分:3)

不清楚你为什么要进行分组......而你只需要将SelectMany分割出来并按照它的外观展平:

var separators = new[] { ';', ',' };
var r = xdoc.Descendants("TestCase")
            .Select(x => (string) x.Attribute("ID"))
            .Where(ids => ids != null)
            .SelectMany(ids => ids.Split(separators,
                                         StringSplitOptions.RemoveEmptyEntries))
            .Select(id => int.Parse(id.Trim()))
            .OrderBy(id => id)
            .ToList();

请注意,我已将每个ID解析为整数,理由是如果您将它们视为字符串,则&#34; 123&#34;来自&#34; 55&#34;。如果他们实际上不一定是整数,但是你想要排序任何可以解析为整数的值,那么排序部分会变得更加棘手。

答案 1 :(得分:2)

这可能有效:

var r = (from lv1 in xdoc.Descendants("TestCase")
        select new { ID = lv1.Attribute("ID").Value }).
        Where(d => d.ID != string.Empty).OrderBy(l => int.Parse(l.ID)).ToList();