C# 用C语言从XML文档中提取和汇总数据#

C# 用C语言从XML文档中提取和汇总数据#,c#,xml,algorithm,C#,Xml,Algorithm,我试图从XML文档中提取数据,并在C#中根据时间汇总数据 例如,我有以下XML文档: 文件1: "<HourlyTotals>" + "<Data>" + "<Time>08:00</Time>" + "<NetSales>200.25</NetSales>" + "

我试图从XML文档中提取数据,并在C#中根据时间汇总数据

例如,我有以下XML文档:

文件1:

                "<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),
    });