我有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();
答案 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();