Gan*_*sha 5 group-by linq-to-xml
我想使用LINQ将输入XML转换为输出XML,方法是在"Summary"字段上执行GROUPBY并将Balance字段向上扩展.
输入XML:
<Root>
<Account>
<Summary>Checking</Summary>
<Comprehensive>Interest Checking Account</Comprehensive>
<Currency>Dollar</Currency>
<Balance>10000000.000000</Balance>
</Account>
<Account>
<Summary>Savings</Summary>
<Comprehensive>Market Account</Comprehensive>
<Currency>Dollar</Currency>
<Balance>20000000.000000</Balance>
</Account>
<Account>
<Summary>Checking</Summary>
<Comprehensive>Interest Checking Account</Comprehensive>
<Currency>Dollar</Currency>
<Balance>50000000.000000</Balance>
</Account>
</Root>
Run Code Online (Sandbox Code Playgroud)
输出XML:
<Root>
<Account>
<Summary>Checking</Summary>
<Comprehensive>Interest Checking Account</Comprehensive>
<Currency>Dollar</Currency>
<Balance>60000000.000000</Balance>
</Account>
<Account>
<Summary>Savings</Summary>
<Comprehensive>Market Account</Comprehensive>
<Currency>Dollar</Currency>
<Balance>20000000.000000</Balance>
</Account>
</Root>
Run Code Online (Sandbox Code Playgroud)
我试过这个,但无法获取节点/元素:
XElement groupData = new XElement("Root",
chartData.Elements().GroupBy(x => x.Element("Summary").Value).
Select(g => new XElement("Account", g.Key, g.Elements("Comprehensive"),
g.Elements("Currency"),
g.Sum(
s =>
(decimal)
s.Element("Balance")))));
Run Code Online (Sandbox Code Playgroud)
任何帮助,将不胜感激.提前致谢.
如果您不想要中间对象,您可以使用
XDocument input = XDocument.Load("input.xml");
XDocument output =
new XDocument(
new XElement(input.Root.Name,
from account in input.Root.Elements("Account")
group account by account.Element("Summary").Value into g
select new XElement("Account",
g.ElementAt(0).Elements().Where(e => e.Name != "Balance"),
new XElement("Balance", g.Elements("Balance").Sum(b => (decimal)b)
))));
output.Save("output.xml");
Run Code Online (Sandbox Code Playgroud)
或者您可以使用方法语法
XDocument input = XDocument.Load(@"input.xml");
XDocument output = new XDocument(
new XElement(input.Root.Name,
input.Root.Elements("Account")
.GroupBy(a => a.Element("Summary").Value)
.Select(g => new XElement("Account",
g.ElementAt(0).Elements().Where(e => e.Name != "Balance"),
new XElement("Balance", g.Elements("Balance").Sum(b => (decimal)b)
)))));
output.Save("output.xml");
Run Code Online (Sandbox Code Playgroud)
我建议投影到普通对象中,将它们分组,然后投影回 XML:
var data = from acct in chartData.Elements()
select new {
Summary = (string)acct.Element("Summary"),
Comprehensive = (string)acct.Element("Comprehensive"),
Currency = (string)acct.Element("Currency"),
Balance = (decimal)acct.Element("Balance"),
};
var grouped = from acct in data
group acct by acct.Summary into g
select new {
Summary = g.Key,
Comprehensive = g.First().Comprehensive,
Currency = g.First().Comprehensive,
Balance = g.Sum(),
};
var groupData = new XElement("Root",
from g in grouped
select new XElement("Account",
new XElement("Summary", g.Summary),
new XElement("Comprehensive", g.Comprehensive),
new XElement("Currency", g.Currency),
new XElement("Balance", g.Balance.ToString("0.000000"))
)
);
Run Code Online (Sandbox Code Playgroud)