如何在 XML 的子子节点中查找属性的值
本文关键字:查找 属性 子节点 XML | 更新日期: 2023-09-27 18:32:01
我有一个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"中"result"属性的结果为"失败"时,我还必须显示"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# 中为上述要求编写代码??
将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;
}
if (document.ToString().Contains(@"<UnitTestResult testName=""TestMethod2"" outcome=""failed"">"))
{
}
我知道这不会是一个流行的答案。