将数据/值列表转换为对象属性

用户19702

我有一个嵌套的字典式数组的数组,像$Events这里一样,带有一列属性名和一列值:

PS > $Events[0].EventProperties

Name      #text
-------   -------
EventName ItBroke
Category  Bad
When      2020

作为参考,我使用的这种数据通常来自看起来像这样的xml,所以也许我可以更好地进行处理?:

<Events>
  <EventProperties Name="EventName">ItBroke</EventProperties>
  <EventProperties Name="Category">Bad</EventProperties>
  <EventProperties Name="When">2020</EventProperties>
</Events>
<Events ... />

我想将嵌套EventProperties成员数组转换为对象,具有Name =Name和Value =的属性,#text如下所示:

PS > $EventData[0]

EventName : ItBroke
Category  : Bad
When      : 2020

我将以目前的方式进行回答,但是它运行缓慢且扩展性很差,因此我正在寻求更好地构建此结构的帮助。感觉很简单,我不知道自己能找到的正确术语。

事物管理

通过使用哈希表存储属性/值数据,将这些哈希表转换为自定义对象,然后避免使用效率低下+=的数组扩展,可以优化已完成的工作

$EventData = $Events | Foreach-Object {
    $hash = [ordered]@{}
    $_.EventProperties | Foreach-Object {
        $hash[$_.Name] = $_.innertext
    }
    [pscustomobject]$hash
}
$EventData

您可能会查看PowerShell 7,并考虑Foreach-Object -Parallel是否有很多EventProperties节点。

所有循环都是必需的,因为您要将属性名称转换为属性。所述[xml]加速器转换元件(节点)名称属性。我相信此行为是PowerShell中其他XML反序列化器的典型现象。


如果将XML重组为将那些属性名称作为元素名称,则仅需要从XML到对象的转换:

# sample x.xml
<root>
<Events>
  <EventProperties>
    <EventName>ItBroke</EventName>
    <Category>Bad</Category>
    <When>2020</When>
  </EventProperties>
</Events>
<Events>
  <EventProperties>
    <EventName>ItBroke</EventName>
    <Category>Bad</Category>
    <When>2020</When>
  </EventProperties>
</Events>
</root>

# Conversion Code
$x = [xml](Get-Content x.xml)
$x.Root.Events.EventProperties

# Output
EventName Category When
--------- -------- ----
ItBroke   Bad      2020
ItBroke   Bad      2020

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章