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

PowerShell按Event分组统计XML中Item数量问题求助

问题描述

有如下结构的XML文档:

<parent>
  <somethingIamNotInterestedin>
    ....
  </somethingIamNotInterestedin>
  <body>
    <event>
      <eventid>1234</eventid>
      <list>
        <item>some text</item>
        <item>some text</item>
        <item>some text</item>
        ...many more
      </list>
      <action>DELETE</action>
    </event>
    <event>
      <eventid>3456</eventid>
      <list>
        <item>some text</item>
        <item>some text</item>
        <item>some text</item>
        ...many more
      </list>
      <action>ADD</action>
    </event>
  </body>
</parent>

需要按每个<event>节点分组,统计对应<list>节点下<item>节点的数量,输出格式如下(假设第一个list有245个item,第二个有123个):

1234;DELETE;245
3456;ADD;123

尝试了以下PowerShell代码:

$events=$xml.parent.body.SelectNodes('Event')
foreach ($event in $events) { write-host $event.list.SelectNodes('item').count}

但执行后总是得到所有item的总数量,而非每个event对应的数量,该如何解决?

解决方案

问题出在SelectNodes的路径写法上:当你直接用SelectNodes('item')时,PowerShell会默认从XML文档的根节点开始查找,导致统计了全局所有<item>的总数。

你可以用两种方法解决:

方法一:修正XPath相对路径

给XPath表达式加上.前缀,明确表示从当前节点($event.list)的上下文开始查找:

# 先确保已正确加载XML,比如 $xml = [xml](Get-Content '你的XML文件路径.xml')
$events = $xml.parent.body.SelectNodes('event')
foreach ($event in $events) {
    $itemCount = $event.list.SelectNodes('.//item').Count
    # 按要求格式输出
    "$($event.eventid);$($event.action);$itemCount"
}

方法二:直接使用PowerShell XML属性访问

PowerShell可以直接通过节点的属性名访问子节点,无需SelectNodes,写法更简洁:

# 加载XML后直接遍历event节点
$xml.parent.body.event | ForEach-Object {
    "$($_.eventid);$($_.action);$($_.list.item.Count)"
}

两种方法都能正确统计每个<event>下<list>内的<item>数量,并输出你需要的分号分隔格式。

内容的提问来源于stack exchange,提问作者user1375452

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.21 05:13:14