如何通过PowerShell将PSCustomObject转为属性名作为标签的XML?
实现PSCustomObject转指定格式XML的方法
默认的ConvertTo-Xml命令会生成带<Property Name="XXX">的节点,要得到属性名直接作为节点名的XML,可通过以下两种方法实现:
方法一:手动构建XML文档(推荐,健壮性高)
通过System.Xml.XmlDocument类手动创建节点,能精准控制XML结构,适合处理复杂对象或包含特殊字符的属性值:
# 示例PSCustomObject $data = [PSCustomObject]@{ ABC = 1 PQR = 2 XYZ = 3 } # 初始化XML文档 $xml = New-Object System.Xml.XmlDocument $xmlDeclaration = $xml.CreateXmlDeclaration("1.0", "utf-8", $null) $xml.AppendChild($xmlDeclaration) | Out-Null # 创建根节点<Objects> $objectsRoot = $xml.CreateElement("Objects") $xml.AppendChild($objectsRoot) | Out-Null # 创建<Object>子节点 $objectNode = $xml.CreateElement("Object") $objectsRoot.AppendChild($objectNode) | Out-Null # 遍历对象属性,生成对应节点 foreach ($prop in $data.PSObject.Properties) { $propElement = $xml.CreateElement($prop.Name) $propElement.InnerText = $prop.Value $objectNode.AppendChild($propElement) | Out-Null } # 输出格式化后的XML(PowerShell 7+可用Format-Xml,Windows PowerShell可使用$xml.Save([Console]::Out)) $xml.OuterXml | Format-Xml
方法二:正则替换(快速简单,适合简单场景)
对ConvertTo-Xml的输出结果做正则替换,直接将<Property Name="XXX">YYY</Property>替换为<XXX>YYY</XXX>:
# 示例PSCustomObject $data = [PSCustomObject]@{ ABC = 1 PQR = 2 XYZ = 3 } # 先执行默认转换 $rawXml = ConvertTo-Xml -As String -NoTypeInformation -InputObject $data # 正则替换节点格式 $formattedXml = $rawXml -replace '<Property Name="([^"]+)">([^<]+)</Property>', '<$1>$2</$1>' # 输出结果 $formattedXml
注意:此方法仅适合属性值不含XML特殊字符(如
<、>)的简单场景,若属性值包含特殊字符,可能会破坏XML结构。
内容的提问来源于stack exchange,提问作者Prasad Gavande
相关产品推荐
相关产品推荐

