比较使用名称标签XML节点值和删除标记
问题描述:
我有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>
如果将订单标记值等于另一个的OrderId标记值然后添加量标签和删除新添加的标签。
结果输出我需要应该像下面
<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:
我的新XML像下面
<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>
如果将订单一样那么OrderItem的标签添加到匹配的标签。 结果我需要像下面
<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
}));
}
答
有几个步骤:
- 集团订单一起通过ID,然后为每个分组...
- 获取总金额
- 设置第一个订单金额总
- 卸下剩余的订单
的代码是相当简单:
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。
答
听起来像是由OrderId
标准组Sum(amount)
转型,这可以通过以下LINQ来完成,以XML查询:
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")))));
答
使用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();
}
}
}
}
}
}
简称组你'orderItems'通过'OrderId'并总结'金额' –