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

时间:2013-09-19 10:41:10

标签: c# xml-parsing

我有一个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#中编写上述要求的代码?

2 个答案:

答案 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"">"))
{

}

这不是我所知道的流行答案。