如何在 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# 中为上述要求编写代码??

如何在 XML 的子子节点中查找属性的值

将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"">"))
{
}

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