PowerShell中如何将XML转换为PsCustomObject以最终导出为JSON
PowerShell XML转PSCustomObject实现(适配JSON导出结构)
以下函数可直接将XML节点转换为与ConvertFrom-Json输出结构完全一致的PSCustomObject,自动处理同名节点数组转换、属性映射、纯文本节点解析,无冗余XML内置字段。
核心转换逻辑
- 根节点自动作为最外层对象属性
- XML节点属性直接映射为对象同名字段
- 纯文本子节点直接赋值为对应字段值,不生成嵌套结构
- 同级同名节点自动归集为数组,单个子节点不做无意义数组包裹
- 字段顺序与XML原始顺序保持一致,转JSON时不会乱序
实现代码
function Convert-XmlToPSCustomObject { param( [Parameter(Mandatory, ValueFromPipeline)] [System.Xml.XmlNode]$XmlNode ) process { $result = [ordered]@{} # 映射当前节点所有属性 foreach ($attr in $XmlNode.Attributes) { $result[$attr.Name] = $attr.Value } # 分组处理子节点 $childGroups = $XmlNode.ChildNodes | Group-Object -Property Name foreach ($group in $childGroups) { $childItems = foreach ($child in $group.Group) { if ($child.NodeType -eq [System.Xml.XmlNodeType]::Text) { $child.Value } else { Convert-XmlToPSCustomObject -XmlNode $child } } if ($group.Name -eq '#text') { # 处理当前节点直接挂载的文本内容 if ($childItems.Count -gt 0 -and $result.Count -eq 0) { return $childItems -join '' } continue } # 单节点直接赋值,多同名字段转数组,兼容PowerShell 5.1及以上版本 if ($childItems.Count -eq 1) { $result[$group.Name] = $childItems[0] } else { $result[$group.Name] = $childItems } } [pscustomobject]$result } }
调用方式
针对测试XML,按如下方式调用即可得到预期结构的对象:
[xml]$Xml = @" <Action name="Test" id="1"> <Text>sample</Text> <sub name="s1" id="2" /> <sub name="s2" id="3" /> <end details="no" /> </Action> "@ # 包装根节点匹配预期外层结构 $targetObject = [pscustomobject]@{ $Xml.DocumentElement.Name = Convert-XmlToPSCustomObject -XmlNode $Xml.DocumentElement }
结构验证
执行以下命令导出JSON,可得到与参考结构完全一致的输出:
$targetObject | ConvertTo-Json -Depth 10
内容的提问来源于stack exchange,提问作者Carsten
相关产品推荐
相关产品推荐

