在下面的XML文件中,需要一起使用的元素在XElements
之间分解。 (这超出了我的控制范围)。例如,我想将ToolVersion
与Result
结合使用。
<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获得最深的孩子,但这会逐个迭代。在上面的示例中,我可能需要ToolVersion
和Result
,但之后需要返回LicensingStatus
,然后选择我离开的地方。 (代码不需要明确忽略Result
,因为我可以在switch
语句中忽略它。
这可能吗?
答案 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
元素,然后从LicensingData
和Health
中选择所需的值。
在此示例中,它们只存储在匿名对象中,但您可以创建自己的类型对象。
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);
}