2

我有一个具有以下结构的 XML:

<Results>
<TestResultAggregation testName="MyOrder">
  <Counters error="0" failed="1" timeout="0" aborted="0" inconclusive="0"/>
  <InnerResults>
    <UnitTestResult testName="TestMethod3" outcome="Failed">
      <Output>
        <ErrorInfo>
          <Message>Assert.Fail failed. </Message>
          <StackTrace>
            at Random.UnitTest1.TestMethod3()
          </StackTrace>
        </ErrorInfo>
      </Output>
    </UnitTestResult>
    <UnitTestResult testName="TestMethod2" outcome="Passed">
      <Output>
      </Output>
    </UnitTestResult>
  </InnerResults>
</TestResultAggregation>

当 'UnitTestResult' 中的 'outcome' 属性的结果为 'failed' 时,我也必须显示 'ErrorInfo' 和 'StackTrace' 节点的值。这里的问题是上述模式不是固定的。例如,

<Results>
<UnitTestResult testName="TestMethod3" outcome="Failed">
      <Output>
        <ErrorInfo>
          <Message>Assert.Fail failed. </Message>
          <StackTrace>
            at Random.UnitTest1.TestMethod3()
          </StackTrace>
        </ErrorInfo>
      </Output>
    </UnitTestResult>
    <UnitTestResult testName="TestMethod2" outcome="Passed">
      <Output>
      </Output>
    </UnitTestResult>

上述模式也可以动态生成。

如何在 C# 中为上述要求编写代码??

4

2 回答 2

3

将 LINQ2XML 与后代方法一起使用..

XDocument doc=XDocument.Parse(xmlstr);
var result=doc.Descendants().Elements("UnitTestResult")
                   .Where(x=>x.Attribute("outcome").Value=="Failed")
                   .Select(x=>
                    new
                    {
                         Message=x.Element("Output")
                                  .Element("ErrorInfo")
                                  .Element("Message").Value,
                         StackTrace=x.Element("Output")
                                     .Element("ErrorInfo")
                                     .Element("StackTrace").Value
                    });

现在你可以迭代result

foreach(var error in result)
{
    error.Message;
    error.StackTrace;
}
于 2013-09-19T10:53:19.157 回答
0
if (document.ToString().Contains(@"<UnitTestResult testName=""TestMethod2"" outcome=""failed"">"))
{

}

我知道这不会是一个流行的答案。

于 2013-09-19T10:52:27.530 回答