按属性在PowerShell中分组XML元素的简单方法

时间:2013-03-11 21:30:22

标签: xml powershell xpath

我有一个简单的XML文档,我在PowerShell中解析,需要按属性值对元素进行分组。这是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,因此诸如制作输出标记和将项目作为子项的建议无效。

我最终想要的是一个字典,它将每个唯一的输出字符串映射到具有该输出属性字符串的节点列表。

我可以通过迭代元素手动执行此操作,在看到新的输出值时创建字典,并在大循环中填充列表,但我很好奇:使用PowerShell查询语法或XPath是否有更优雅的方式魔法创造这本字典?我最近一直在使用PowerShell查询语法,发现它有很多功能;这个范围内的任务是什么?

1 个答案:

答案 0 :(得分:3)

这样的事情对你有用:

$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}
相关问题