将XML过滤到ILookup并在之后搜索的最佳方法

时间:2013-04-11 17:48:39

标签: c# c#-4.0 linq-to-xml

我对.Net LINQ很新。任何人都可以建议一种最好的智能方法将这个xml过滤成.Net对象,所以在代码中我可以轻松地为测试套件执行所需的测试用程序

<?xml version="1.0" encoding="utf-8" ?>
<TestSuites>
  <TestSuite name="TS1" canexecute ="true">
    <TestCase name="TC1" canexecute ="true"/>
    <TestCase name="TC2" canexecute ="false"/>
    <TestCase name="TC3" canexecute ="true"/>
  </TestSuite>
  <TestSuite name="TS2" canexecute ="false">
    <TestCase name="TC4" canexecute ="true"/>
    <TestCase name="TC5" canexecute ="false"/>
    <TestCase name="TC6" canexecute ="true"/>
  </TestSuite>
  <TestSuite name="TS3" canexecute ="false">
    <TestCase name="TC7" canexecute ="true"/>
    <TestCase name="TC8" canexecute ="false"/>
    <TestCase name="TC9" canexecute ="true"/>
  </TestSuite>
</TestSuites>

Expected output
Key   Value
TS1   TC1
      TC3
TS3   TC7
      TC9

1 个答案:

答案 0 :(得分:2)

在我看来,你想要像:

var query = doc.Descendants("TestSuite")
               .Where(x => (bool) x.Attribute("canexecute"))
               .Elements("TestCase")
               .Where(x => (bool) x.Attribute("canexecute"))
               .ToLookup(x => (string) x.Parent.Attribute("name"),
                         x => (string) x.Attribute("name"));

所以说:

  • 找到所有测试套件......
  • ...可以执行
  • ...然后找到他们的测试用例......
  • ...可以执行
  • ...然后按测试套件名称分组,组中的值为测试用例名称

请注意,如果您有多个具有相同名称的测试套件,则使用上述查询,它们将被展平为单个组。