You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何对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")

关键细节说明

  1. 分组逻辑:Group-Object -Property ItemType, ItemID, Color会自动将三个字段完全匹配的Item归为一组,分组的Group属性包含该组所有原始Item节点。
  2. 求和操作:通过Measure-Object -Sum直接对分组内所有MinQty值求和,无需手动循环累加。
  3. 节点重建:复用分组内第一个Item的固定字段结构,避免手动创建每个子节点,保证XML结构一致性。

内容的提问来源于stack exchange,提问作者Bernard Vander Beken

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.19 13:11:13