C# 用C语言从XML文档中提取和汇总数据#
我试图从XML文档中提取数据,并在C#中根据时间汇总数据 例如,我有以下XML文档: 文件1:C# 用C语言从XML文档中提取和汇总数据#,c#,xml,algorithm,C#,Xml,Algorithm,我试图从XML文档中提取数据,并在C#中根据时间汇总数据 例如,我有以下XML文档: 文件1: "<HourlyTotals>" + "<Data>" + "<Time>08:00</Time>" + "<NetSales>200.25</NetSales>" + "
"<HourlyTotals>" +
"<Data>" +
"<Time>08:00</Time>" +
"<NetSales>200.25</NetSales>" +
"<NetReturns>15.25</NetReturns>" +
"<NetIncome>185.00</NetIncome>" +
"<CustomerCount>15</CustomerCount>" +
"<PercentOfIncome>3</PercentOfIncome>" +
"</Data>" +
"<Data>" +
"<Time>08:15</Time>" +
"<NetSales>100.25</NetSales>" +
"<NetReturns>15.25</NetReturns>" +
"<NetIncome>85.00</NetIncome>" +
"<CustomerCount>2</CustomerCount>" +
"<PercentOfIncome>1.5</PercentOfIncome>" +
"</Data>" +
"<Data>" +
"<Time>08:30</Time>" +
"<NetSales>100.25</NetSales>" +
"<NetReturns>15.25</NetReturns>" +
"<NetIncome>85.00</NetIncome>" +
"<CustomerCount>2</CustomerCount>" +
"<PercentOfIncome>1.5</PercentOfIncome>" +
"</Data>" +
"<Data>" +
"<Time>10:00</Time>" +
"<NetSales>100.25</NetSales>" +
"<NetReturns>10.25</NetReturns>" +
"<NetIncome>176.00</NetIncome>" +
"<CustomerCount>10</CustomerCount>" +
"<PercentOfIncome>1</PercentOfIncome>" +
"</Data>" +
"</HourlyTotals>"
fakeXML是字符串列表,其中包含作为字符串的各个XML文档
这段代码只允许我从XML文档中提取单个节点
我无法根据时间节点的值找出一种有效的方法来汇总它。任何关于如何进行的线索都将非常棒
提前感谢。在您获得所有数据后。按
Time
对它们进行分组,然后将每组中的值相加
var data = fakeXML.SelectMany(selector => {
XDocument doc = XDocument.Parse(selector);
return from q in doc.Descendants("Data")
select new {
Time = q.Element("Time").Value,
NetSales = (decimal)q.Element("NetSales"),
NetReturns = (decimal)q.Element("NetReturns"),
NetIncome = (decimal)q.Element("NetIncome"),
CustCount = (int)q.Element("CustomerCount"),
PercentOfIncome = (double)q.Element("PercentOfIncome")
};
});
var summary = data.GroupBy(d => d.Time)
.Select(g => new {
Time = g.Key,
NetSales = g.Sum(d => d.NetSales),
NetReturns = g.Sum(d => d.NetReturns),
NetIncome = g.Sum(d => d.NetIncome),
CustCount = g.Sum(d => d.CustCount),
});
汇总集合中的每个项目都会按时间进行汇总。在获得所有数据后。按时间和每组中值的总和分组。我不会使用
decimal.Parse()
、int.Parse()
或double.Parse()
,因为它们是特定于区域设置的。相反,请使用已经提供的API,例如对于decimal
或仅使用小数:NetSales=(decimal)q.Element(“NetSales”),
@dbc fixed。再次感谢你的建议。
"<HourlyTotals>" +
"<Data>" +
"<Time>08:00</Time>" +
"<NetSales>22.25</NetSales>" +
"<NetReturns>21.25</NetReturns>" +
"<NetIncome>122.00</NetIncome>" +
"<CustomerCount>3</CustomerCount>" +
"<PercentOfIncome>6</PercentOfIncome>" +
"</Data>" +
"<Data>" +
"<Time>08:15</Time>" +
"<NetSales>174.00</NetSales>" +
"<NetReturns>16.00</NetReturns>" +
"<NetIncome>68.00</NetIncome>" +
"<CustomerCount>2</CustomerCount>" +
"<PercentOfIncome>0.2</PercentOfIncome>" +
"</Data>" +
"<Data>" +
"<Time>08:30</Time>" +
"<NetSales>99.00</NetSales>" +
"<NetReturns>88.00</NetReturns>" +
"<NetIncome>69.00</NetIncome>" +
"<CustomerCount>6</CustomerCount>" +
"<PercentOfIncome>9</PercentOfIncome>" +
"</Data>" +
"<Data>" +
"<Time>09:30</Time>" +
"<NetSales>100.25</NetSales>" +
"<NetReturns>10.25</NetReturns>" +
"<NetIncome>176.00</NetIncome>" +
"<CustomerCount>10</CustomerCount>" +
"<PercentOfIncome>1</PercentOfIncome>" +
"</Data>" +
"</HourlyTotals>"
foreach (var selector in fakeXML)
{
XDocument doc = XDocument.Parse(selector);
var data = doc.Descendants("Data");
var result1 = from q in data
select new
{
Time = q.Element("Time").Value,
NetSales = q.Element("NetSales").Value,
NetReturns = q.Element("NetReturns").Value,
NetIncome = q.Element("NetIncome").Value,
CustCount = q.Element("CustomerCount").Value,
PercentOfIncome = q.Element("PercentOfIncome").Value
}
}
var data = fakeXML.SelectMany(selector => {
XDocument doc = XDocument.Parse(selector);
return from q in doc.Descendants("Data")
select new {
Time = q.Element("Time").Value,
NetSales = (decimal)q.Element("NetSales"),
NetReturns = (decimal)q.Element("NetReturns"),
NetIncome = (decimal)q.Element("NetIncome"),
CustCount = (int)q.Element("CustomerCount"),
PercentOfIncome = (double)q.Element("PercentOfIncome")
};
});
var summary = data.GroupBy(d => d.Time)
.Select(g => new {
Time = g.Key,
NetSales = g.Sum(d => d.NetSales),
NetReturns = g.Sum(d => d.NetReturns),
NetIncome = g.Sum(d => d.NetIncome),
CustCount = g.Sum(d => d.CustCount),
});