You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.28 07:48:57