如何用PowerShell解析内部XML并转换为.properties文件?
解决PowerShell中XML片段转.properties文件的问题
步骤1:解析XML片段
你提供的是无根节点的XML片段,需要先包裹为完整XML文档才能被PowerShell解析:
# 定义你的XML片段内容 $xmlContent = @" <sl-test.protocol>HTTP</sl-test.protocol> <sl-test.responseTimeout>14000</sl-test.responseTimeout> <env>${myenv}</env> <http.port>8081</http.port> "@ # 包裹成带根节点的完整XML结构 $fullXml = [xml]"<root>$xmlContent</root>"
步骤2:遍历节点生成转义后的键值对
遍历根节点下所有子节点,提取节点名作为键,节点文本作为值,同时转义所有$符号:
$keyValuePairs = foreach ($node in $fullXml.root.ChildNodes) { # 转义值中的$符号,替换为`$ $escapedValue = $node.InnerText -replace '\$', '`$' # 拼接成键值对格式 "$($node.Name)=$escapedValue" } # 用换行符连接所有键值对,得到目标字符串 $propertiesContent = $keyValuePairs -join "`n"
步骤3:生成.properties文件
用你熟悉的方式写入文件(如果文件已存在,-Force参数会覆盖原有内容):
# 直接创建或覆盖文件并写入内容 New-Item -Name "mule-app.properties" -ItemType "file" -Value $propertiesContent -Force # 若文件已存在,也可使用Set-Content更直观 # Set-Content -Path "mule-app.properties" -Value $propertiesContent -Force
最终效果
生成的mule-app.properties内容如下:
sl-test.protocol=HTTP sl-test.responseTimeout=14000 env=`${myenv} http.port=8081
关键说明
- 动态适配:不管XML中有多少节点,代码都会自动遍历所有子节点生成键值对,无需硬编码
- 转义逻辑:通过
-replace正则替换实现$符号的转义,符合你要求的格式 - XML解析:必须添加根节点,否则PowerShell的
[xml]类型无法正确解析片段内容
内容的提问来源于stack exchange,提问作者Harry
相关产品推荐
相关产品推荐

