Skip to main content
 首页 » 编程设计

xml之在PowerShell中按属性对XML元素进行分组的简单方法

2025年05月04日185lyj

我在PowerShell中解析了一个简单的XML文档,需要按属性值对元素进行分组。 XML的结构如下:

<Root> 
  <Items> 
     <Item Input="Foo1" Output="Bin/A" /> 
     <Item Input="Foo2" Output="Bin/A" /> 
     <Item Input="Foo3" Output="Bin/B" /> 
     <Item Input="Foo4" Output="Bin/C" /> 
     <Item Input="Foo5" Output="Bin/A" /> 
  </Items> 
</Root> 

出于不值得讨论的原因,我无法重新格式化XML,因此建议诸如使Output标记和将Items设置为子代是无效的。

我最终想要得到的实际上是一个字典,该字典将每个唯一的Output字符串映射到具有该字符串的Output属性的节点列表。

我可以通过迭代元素,创建字典(如看到新的Output值)以及在大循环中填充列表来手动完成此操作,但我很好奇:是否可以使用PowerShell查询语法或XPath magic创建更优雅的方法这本字典?我最近一直在使用PowerShell查询语法,并且发现它具有很多功能。这个任务在那个范围内吗?

请您参考如下方法:

这样的事情应该为您工作:

$xml = [xml] @' 
<Root> 
  <Items> 
     <Item Input="Foo1" Output="Bin/A" /> 
     <Item Input="Foo2" Output="Bin/A" /> 
     <Item Input="Foo3" Output="Bin/B" /> 
     <Item Input="Foo4" Output="Bin/C" /> 
     <Item Input="Foo5" Output="Bin/A" /> 
  </Items> 
</Root> 
'@ 
 
$grouped = $xml.Root.Items.Item | Group Output 
$grouped  

给出:
Count Name                      Group 
----- ----                      ----- 
    3 Bin/A                     {Item, Item, Item} 
    1 Bin/B                     {Item} 
    1 Bin/C                     {Item}