查询未获取所有记录

时间:2011-11-29 10:00:23

标签: c# xml linq linq-to-xml

我有一个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();
    }

我只获得上述查询的第一个值。

3 个答案:

答案 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( “坑”)

这将返回所有元素,它们是元素的后代。