我有一个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>
结果&#39;结果&#39;属于&#39; UnitTestResult&#39;失败&#39;,我必须显示&#39; ErrorInfo&#39;和StackTrace&#39;节点也是。这里的问题是上面的架构不是固定的。例如,
<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#中编写上述要求的代码?
答案 0 :(得分:3)
将LINQ2XML与Descendants方法一起使用..
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;
}
答案 1 :(得分:0)
if (document.ToString().Contains(@"<UnitTestResult testName=""TestMethod2"" outcome=""failed"">"))
{
}
这不是我所知道的流行答案。