使用LINQ to XML简化Lambda到Sum Sibling标记值

时间:2014-05-15 11:54:38

标签: c# xml linq lambda

我有xml文档:

<File> 
  <Record type="16">
    <Fields>
        <Field title="SummCode">470</Field>
        <Field title="Amount">100819</Field>
           etc...
    </Fields>
  </Record>
</File>

我写了以下语句,用&#34; Amount&#34;来汇总字段的值。所有Fields元素的属性,其中Field的值为&#34; SummCode&#34;属性是&#34; 470&#34;。

它有效但我觉得我过于复杂了。我选择了Field级别并回顾祖先以回到Field级别。如果有更好的方法,我很好奇。

var xml = XElement.Load(@"C:\XML File Generated 5-13-14.xml");
var sum = xml.Descendants("Field")
    .Where(r => r.Attribute("title").Value == "SummCode" && r.Value == "470")
    .Ancestors("Fields")
    .Elements("Field")
    .Where( s => s.Attribute("title").Value == "Amount")
    .Select (t => double.Parse(t.Value))
    .Sum();

1 个答案:

答案 0 :(得分:1)

这对我有用:

var sum = xml.Descendants("Fields")
    .Where(x => x.Elements("Field")
        .Any(r => r.Attribute("title").Value == "SummCode" && r.Value == "470"))
    .Elements("Field")
    .Where(x => x.Attribute("title").Value == "Amount")
    .Sum(x => (double)x);

我不知道它是否更简单。

但是,它会纠正查询中的潜在错误。如果你有这个xml:

<File> 
  <Record type="16">
     <Fields>
        <Field title="SummCode">470</Field>
        <Field title="SummCode">470</Field>
        <Field title="Amount">1</Field>
    </Fields>
  </Record>
</File>

然后您的代码返回2,而我的代码将返回1。我不知道你的文件格式是否可行,或者你是否打算在这种情况下返回2


我以为我会放弃另一种选择。这可能有点陌生,但也可能更容易阅读。

var sum =
(
    from x in xml.Descendants("Fields")
    let fields = x.Elements("Field")
        .ToLookup(y => y.Attribute("title").Value, y => y.Value)
    where fields["SummCode"].Where(y => y == "470").Any()
    from a in fields["Amount"]
    select double.Parse(a)
).Sum();