2017-12-07 12 views
1

XML文書からデータを抽出し、C#で時間に基づいてデータをロールアップしようとしています。例えばC#でXML文書からデータを抽出してロールアップする

- 私は、次の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>" 

を引用符と「+」を無視してください:それはので、私は偽物を作成しようとしていたという事実ですXMLデータを取得し、C#のリストに文字列として渡します。

文献2:

  "<HourlyTotals>" + 
      "<Data>" + 
      "<Time>08:00</Time>" + 
      "<NetSales>100.25</NetSales>" + 
      "<NetReturns>10.25</NetReturns>" + 
      "<NetIncome>176.00</NetIncome>" + 
      "<CustomerCount>10</CustomerCount>" + 
      "<PercentOfIncome>1</PercentOfIncome>" + 
      "</Data>" + 
      "<Data>" + 
      "<Time>08:15</Time>" + 
      "<NetSales>120.00</NetSales>" + 
      "<NetReturns>11.00</NetReturns>" + 
      "<NetIncome>54.00</NetIncome>" + 
      "<CustomerCount>5</CustomerCount>" + 
      "<PercentOfIncome>2.3</PercentOfIncome>" + 
      "</Data>" + 
      "<Data>" + 
      "<Time>08:30</Time>" + 
      "<NetSales>160.11</NetSales>" + 
      "<NetReturns>17.25</NetReturns>" + 
      "<NetIncome>34.00</NetIncome>" + 
      "<CustomerCount>4</CustomerCount>" + 
      "<PercentOfIncome>3.2</PercentOfIncome>" + 
      "</Data>" + 
      "<Data>" + 
      "<Time>09:15</Time>" + 
      "<NetSales>100.25</NetSales>" + 
      "<NetReturns>10.25</NetReturns>" + 
      "<NetIncome>176.00</NetIncome>" + 
      "<CustomerCount>10</CustomerCount>" + 
      "<PercentOfIncome>1</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>" 

文献3:

私はロールアップしNetSales、NetReturns、NetIncome、CustomerCountとPercentOfIncome値を時間によってたい
  "<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>" 

。例えば、時刻8時が 322.75(200.25 + 100.25 + 22.25)NetSales値としてなどの値を有していなければならない..

タイムノード値は、午前8時から午後11時45分の範囲であることができます。私はすべての時間間隔を抽出し、それらに基づいて値をロールアップする効率的な方法を見つけようとしています。

これまでのところ、私はXMLから個々のノードのデータを抽出するためのコードを書かれている:

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 
          } 

     } 

fakeXMLは、文字列として、個々のXML文書が含まれている文字列のリストです。

このコードでは、XMLドキュメントから個々のノードを抽出することができます。

タイムノードの値に基づいてロールアップする効果的な方法を理解できません。どのように進行するかについてのリードは本当に素晴らしいでしょう!

ありがとうございます。

+0

すべてのデータを取得した後。各グループの時間と各値の合計でグループ化します。 – Nkosi

答えて

1

あなたはすべてのデータを持っていた後。グループをTimeでグループ化し、次にSumを各グループの値を上にしてグループ化します。

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

サマリーコレクションの各アイテムには合計時間が表示されます。

+1

'decimal.Parse()'、 'int.Parse()'、 'double.Parse()'はロケール固有のものなので使用しません。代わりに、既に提供されているAPIを使用してください。 '' XmlConvert.ToDecimal() '](https://msdn.microsoft.com/en-us/library/system.xml.xmlconvert.todecimal(v = vs.110).aspx)または' [NetSales =(10進)q.Element( "NetSales")]を10進数に[直接キャスト](https://msdn.microsoft.com/en-us/library/bb353285(v=vs.110).aspx) 、 ' – dbc

+0

@dbcが修正されました。アドバイスをいただき、ありがとうございます。 – Nkosi

+0

これは完全に機能します。ありがとう、Nkosi! –

関連する問題