使用XML文件中的单独元素

时间:2013-07-09 00:51:13

标签: c# xml linq

在下面的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>

我知道如何从this post获得最深的孩子,但这会逐个迭代。在上面的示例中,我可能需要ToolVersionResult,但之后需要返回LicensingStatus,然后选择我离开的地方。 (代码不需要明确忽略Result,因为我可以在switch语句中忽略它。

这可能吗?

2 个答案:

答案 0 :(得分: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 Tutorial了解有关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;

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

答案 1 :(得分: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);
  }