如何对XML中重复Item元素分组合并并对MinQty字段求和?
合并XML中相同组合的Item元素并求和MinQty
示例输入输出
示例输入XML
<Root> <Item> <ItemType>A</ItemType> <ItemID>100</ItemID> <Color>Red</Color> <MinQty>5</MinQty> </Item> <Item> <ItemType>A</ItemType> <ItemID>100</ItemID> <Color>Red</Color> <MinQty>3</MinQty> </Item> <Item> <ItemType>B</ItemType> <ItemID>200</ItemID> <Color>Blue</Color> <MinQty>2</MinQty> </Item> </Root>
预期输出XML
<Root> <Item> <ItemType>A</ItemType> <ItemID>100</ItemID> <Color>Red</Color> <MinQty>8</MinQty> </Item> <Item> <ItemType>B</ItemType> <ItemID>200</ItemID> <Color>Blue</Color> <MinQty>2</MinQty> </Item> </Root>
PowerShell解决方案(基于Group-Object)
直接利用Group-Object按ItemType、ItemID、Color组合分组,再通过Measure-Object对每组的MinQty求和,最后重建XML结构:
# 加载输入XML文件 $xml = [xml](Get-Content -Path "input.xml") # 按指定三个字段组合分组Item节点 $groupedItems = $xml.Root.Item | Group-Object -Property ItemType, ItemID, Color # 清空原Root下的所有Item节点 $xml.Root.RemoveAll() # 遍历每个分组,生成合并后的Item节点 foreach ($group in $groupedItems) { # 取分组内第一个Item作为模板,复用固定字段 $template = $group.Group[0] $newItem = $xml.CreateElement("Item") # 复制固定属性节点 $newItem.ItemType = $template.ItemType $newItem.ItemID = $template.ItemID $newItem.Color = $template.Color # 计算当前分组的MinQty总和 $totalMinQty = ($group.Group.MinQty | Measure-Object -Sum).Sum $newItem.MinQty = $totalMinQty # 将合并后的节点添加到Root $xml.Root.AppendChild($newItem) | Out-Null } # 保存结果到输出XML $xml.Save("output.xml")
关键细节说明
- 分组逻辑:
Group-Object -Property ItemType, ItemID, Color会自动将三个字段完全匹配的Item归为一组,分组的Group属性包含该组所有原始Item节点。 - 求和操作:通过
Measure-Object -Sum直接对分组内所有MinQty值求和,无需手动循环累加。 - 节点重建:复用分组内第一个Item的固定字段结构,避免手动创建每个子节点,保证XML结构一致性。
内容的提问来源于stack exchange,提问作者Bernard Vander Beken
相关产品推荐
相关产品推荐

