我有一个xml结构:
<pit>
<ROW TestID="47855" ExecutionID="1510034507" TestName="USHP" AssertionName="Check News" Status="1" TestLatencyMs="5448" Date="2011-11-29 01:43:45.117" HttpCode="" Error="" TestOwner="mdk" AssertionID="119117" />
<ROW TestID="47855" ExecutionID="1510028579" TestName="USHP" AssertionName="Check News" Status="0" TestLatencyMs="7312" Date="2011-11-29 01:41:46.273" HttpCode="" Error="" TestOwner="fdxk" AssertionID="119117" />
<ROW TestID="47855" ExecutionID="1510022153" TestName="USHP" AssertionName="Check News" Status="0" TestLatencyMs="5860" Date="2011-11-29 01:39:44.153" HttpCode="" Error="" TestOwner="klo" AssertionID="119117" />
</pit>
我正在尝试使用此查询来获取我的ExecutionID,但无济于事:(我不知道出了什么问题。
List<int> executionIdList = new List<int>();
try
{
executionIdList = (from result in xDoc.Root.Descendants("ROW")
where result != null &&
result.Attribute("Status").Value.Equals("0", StringComparison.CurrentCultureIgnoreCase)
select result.Attributes("ExecutionID")).FirstOrDefault().Select(x => int.Parse( x.Value)).ToList();
}
我只获得上述查询的第一个值。
答案 0 :(得分:1)
你没有得到结果的原因是因为
IEnumerable<int> executionIds;
executionIds =
from result in xDoc.Root.Descendants("ROW").Attributes("ExecutionID")
select int.Parse(result.Value);
你需要什么。你的函数在select部分中包含许多看似不必要的代码(但是你可以判断),包括FirstorDefault语句,它只选择第一条记录,如果没有记录,则默认为预定义的值。
答案 1 :(得分:1)
你可以从XDocument中获取你的ExecutionIds,如下所示:
XDocument doc = XDocument.Load(@"C:\Sample1.xml");
List<string> ids = doc.Descendants("pit").Elements().Select(i => i.Attribute("ExecutionID").Value).ToList();
上面的代码从文件Sample1.xml加载xml,然后将所有executionID提取到列表对象中。如果需要,可以向查询添加更多条件,就像检查状态值是否为“0”一样。以下是条件
的代码List<string> ids = doc.Descendants("pit").Elements().Where(k=>k.Attribute("Status").Value == "0").Select(i => i.Attribute("ExecutionID").Value).ToList();
希望有所帮助。
答案 2 :(得分:0)
您正在获取第一行的元素,因为您的查询在“ROW”元素上调用后代,即
xDoc.Root.Descendants( “ROW”)
尝试使用以下代码替换它:
xDoc.Root.Descendants( “坑”)
这将返回所有元素,它们是元素的后代。