在下面的xml中,我想获取名称标签具有的标签ID的值 值“ HighLevelReport%”。
<RunResults xmlns="http://www.hp.com/PC/REST/API">
<RunResult>
<ID>17245</ID>
<Name>output.mdb.zip</Name>
<Type>Output Log</Type>
<RunID>4196</RunID>
</RunResult>
<RunResult>
<ID>17246</ID>
<Name>VuserLog.zip</Name>
<Type>Output Log</Type>
<RunID>4196</RunID>
</RunResult>
<RunResult>
<ID>17248</ID>
<Name>Reports.zip</Name>
<Type>HTML Report</Type>
<RunID>4196</RunID>
</RunResult>
<RunResult>
<ID>17249</ID>
<Name>HighLevelReport_4196.xls</Name>
<Type>Rich Report</Type>
<RunID>4196</RunID>
</RunResult>
</RunResults>
当前我正在使用数据集获取值
using (DataSet reader = ds.ReadXml(xml))
{
DataRow[] DR = reader.Tables[0].Select("Name like '%HighLevelReport%'");
int testID = Convert.ToInt32(DR[0].ItemArray[0].ToString());
}
请帮我做一些其他的选择。
答案 0 :(得分:3)
除非您确实需要,否则我将避免使用DataSet
。如果您只是在处理XML,请使用XML API。我发现LINQ to XML最适合此目的。例如:
XNamespace ns = "http://www.hp.com/PC/REST/API";
var doc = XDocument.Parse(xml);
var ids = doc.Root
.Elements(ns + "RunResult")
.Where(rr => ((string) rr.Element(ns + "Name"))?.StartsWith("HighLevelReport") ?? false)
.Select(rr => (string) rr.Element(ns + "RunID"));
这是一个完整的例子:
using System;
using System.IO;
using System.Linq;
using System.Xml.Linq;
public class Program
{
public static void Main()
{
// Alternatively, use XDocument.Load to load from a file
string xml = File.ReadAllText("test.xml");
var doc = XDocument.Parse(xml);
XNamespace ns = "http://www.hp.com/PC/REST/API";
var ids = doc.Root
.Elements(ns + "RunResult")
.Where(rr => ((string) rr.Element(ns + "Name"))?.StartsWith("HighLevelReport") ?? false)
.Select(rr => (string) rr.Element(ns + "RunID"));
foreach (var id in ids)
{
Console.WriteLine(id);
}
}
}
此处的Where
子句处理缺少的Name
元素-对string
的强制转换将返回null,因此不会调用StartsWith
。如果缺少RunID
元素,则输出中将以null元素结束。