我有一个嵌套的字典式数组的数组,像$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] 删除。
我来说两句