2016-08-13 34 views
0

私が持っているを削除するXMLの例名タグを使用してXMLノード値を比較して、タグ

<order> 
<orderItem> 
    <OrderId>Ex1</OrderId> 
    <amount>100</amount> 
</orderItem> 
<orderItem> 
    <OrderId>Ex2</OrderId> 
    <amount>150</amount> 
</orderItem> 
<orderItem> 
    <OrderId>Ex1</OrderId> 
    <amount>250</amount> 
</orderItem> 
</order> 

受注コードタグの値は、その後額タグを追加して、新しく追加されたタグを削除し、別の受注コードタグの値に等しい場合。

<order> 
<orderItem> 
    <OrderId>Ex1</OrderId> 
    <amount>350</amount> 
</orderItem> 
<orderItem> 
    <OrderId>Ex2</OrderId> 
    <amount>150</amount> 
</orderItem> 
</order> 

の下に受注コード値を変更する必要があるように私が必要とする結果出力はする必要があります。

string filename = "File Location"; 
var doc = XDocument.Load(filename); 
var results = doc.Descendants("order"); 
var orderItemcount = results.Descendants("orderItem").Count(); 

私は次に何をするべきか分かりません。

ありがとうございました。

UPDATE:OrderIdでは同じである場合、一致するタグにそのOrderItemのタグを追加

<order> 
<orderItem> 
    <Orders> 
    <OrderId>Ex1</OrderId> 
    <amount>100</amount> 
    </Orders> 
</orderItem> 
<orderItem> 
    <Orders> 
    <OrderId>Ex2</OrderId> 
    <amount>150</amount> 
    </Orders> 
</orderItem> 
<orderItem> 
    <Orders> 
    <OrderId>Ex1</OrderId> 
    <amount>250</amount> 
    </Orders> 
</orderItem> 
</order> 

以下のように

私の新しいXML。 私はそこにいくつかの手順を実行している

<order> 
<orderItem> 
    <Orders> 
    <OrderId>Ex1</OrderId> 
    <amount>100</amount> 
    </Orders> 
    <Orders> 
    <OrderId>Ex1</OrderId> 
    <amount>250</amount> 
</orderItem> 
<orderItem> 
    <Orders> 
    <OrderId>Ex2</OrderId> 
    <amount>150</amount> 
    <Orders> 
</orderItem> 
</order> 

以下のアップデート回答

var groups = doc.Descendants("order").Descendants("orderItem").Descendants("Orders") 
       .GroupBy(x => (string)x.Element("OrderId")) 
       .ToList(); 


      XElement newXml = new XElement("order"); 
      foreach (var group in groups) 
      { 
       newXml.Add(new XElement("OrderList", new object[] { 
       // new XAttribute("OrderId", group.Key), // If you Need Key for Attribute add this. 
        group 
      })); 
      } 
+1

は、単にグループあなたの 'によってorderItems' 'OrderId'と' amount'を合計します –

答えて

1

のようにする必要があり結果:

  1. グループご注文はidで一緒にして、それぞれにグループ化...
  2. 合計金額を取得
  3. は、コードは非常に簡単です、残りの注文

を削除し、総

  • に最初の注文金額を設定します。

    var ordersById = doc.Descendants("orderItem") 
        .GroupBy(x => (string) x.Element("OrderId")); // 1 
    
    foreach (var grouping in ordersById) 
    { 
        var total = grouping 
         .Sum(x => (decimal) x.Element("amount")); // 2 
    
        grouping.First().SetElementValue("amount", total); // 3 
    
        grouping.Skip(1).Remove(); // 4 
    } 
    

    が作動し、デモ用のthis fiddleを参照してください。

  • 1

    XMLクエリに以下のLINQによって達成することができるSum(amount)変換、とOrderIdによって標準グループのように聞こえる:

    var output = 
        from order in doc.Descendants("order") 
        select new XElement("order", 
         from orderItem in doc.Descendants("orderItem") 
         group orderItem by (string)orderItem.Element("OrderId") into orderItems 
         select new XElement("orderItem", 
          new XElement("OrderId", orderItems.Key), 
          new XElement("amount", orderItems.Sum(e => (int)e.Element("amount")))));     
    
    +0

    どの変数がeであるか分かりますか? – rAm

    +0

    'orderItems'型は' IGrouping 'です。これは' IEnumerable 'です。したがって' e'型は 'XElement'です。 'orderItems'には同じキー(あなたのケースでは" OrderId ")を共有する' XElement'のコレクションが含まれています –

    +0

    ありがとう、ありがとうございます。 – rAm

    0

    使用するXML LINQ

    using System; 
    using System.Collections.Generic; 
    using System.Linq; 
    using System.Text; 
    using System.Xml; 
    using System.Xml.Linq; 
    
    namespace ConsoleApplication1 
    { 
        class Program 
        { 
         const string FILENAME = @"c:\temp\test.xml"; 
         static void Main(string[] args) 
         { 
          XDocument doc = XDocument.Load(FILENAME); 
          var groups = doc.Descendants("orderItem") 
           .GroupBy(x => (string)x.Element("OrderId")) 
           .Select(x => x.Select(y => new {orderId = y, amount = (int)y.Element("amount")})) 
           .ToList(); 
          for (int groupNum = groups.Count - 1; groupNum >= 0; groupNum--) 
          { 
           var group = groups[groupNum]; 
           int total = group.Select(x => x.amount).Sum(); 
           for (int orderItemCount = group.Count() - 1; orderItemCount >= 0; orderItemCount--) 
           { 
            var orderItem = group.Skip(orderItemCount).FirstOrDefault(); 
            if (orderItemCount > 0) 
            { 
             orderItem.orderId.Remove(); 
            } 
            else 
            { 
             XElement amount = orderItem.orderId.Element("amount"); 
             amount.Value = total.ToString(); 
            } 
           } 
          } 
    
         } 
        } 
    } 
    
    関連する問題