1

在下面的 XML 文件中,需要一起使用的元素在XElements. (这超出了我的控制)。例如,我想ToolVersionResult.

<DiagReport>
<LicensingData>
  <ToolVersion>6.3.9431.0</ToolVersion>
  <LicensingStatus>SL_LICENSING</LicensingStatus>
</LicensingData>
<Health>
  <Result>PASS</Result>
  <TamperedItems></TamperedItems>
</Health>
<Genuine>
  <ServerProps>GenuineId</ServerProps>
</Genuine>
</DiagReport>

我知道如何从这篇文章中获得最深的孩子,但这会一一迭代。在上面的示例中,我可能需要ToolVersionand Result,但随后需要回到LicensingStatus,并从我离开的地方继续。(代码不需要明确地忽略Result,因为我可以在我的switch语句中忽略它。

这可能吗?

4

2 回答 2

5

将其解析为 XmlDocument,然后使用 XPath 提取所需的值:

XmlDocument xml = new XmlDocument();
xml.LoadXml(yourXmlString);
string toolVersion = xml.SelectSingleNode("/DiagReport/LicensingData/ToolVersion").InnerText;
string result = xml.SelectSingleNode("/DiagReport/Health/Result").InnerText

您可以在W3Schools XPath 教程中了解有关 XPath 的更多信息。

或者您可以使用 XDocument:

XDocument xml = XDocument.Parse(yourXmlString);
string toolVersion = xml.Element("DiagReport").Element("LicensingData").Element("ToolVersion").Value;
string result = xml.Element("DiagReport").Element("Health").Element("Result").Value;

请注意,这假定所有引用的元素都存在。

于 2013-07-09T00:56:12.560 回答
2

您可以循环遍历所有元素并DiagReport从中选择您需要的值。LicensingDataHealth

在这个例子中它们只是存储在一个匿名对象中,但是您可以创建自己的类型化对象是必需的。

  var xmlDocument = XDocument.Load(@"C:\test.xml");
  var results = xmlDocument.Elements("DiagReport").Select(x => new 
  {
      ToolVersion = x.Descendants("ToolVersion").FirstOrDefault().Value,
      LicensingStatus = x.Descendants("LicensingStatus").FirstOrDefault().Value,
      Result = x.Descendants("Result").FirstOrDefault().Value
  });

  // print results
  foreach (var item in results)
  {
      Console.WriteLine("ToolVersion: {0}, LicensingData: {1}, Result: {2}", item.ToolVersion, item.LicensingStatus, item.Result);
  }
于 2013-07-09T02:10:45.747 回答