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
相关产品推荐
相关产品推荐

