PowerShell操作XML:移除加密密码节点并添加明文密码遇问题求助
PowerShell XML操作:移除指定节点并添加新节点
针对你遇到的两个问题,以下是修正方案和原因说明:
问题1:无法移除password-encrypted节点
你的代码中对jdbc-driver-params节点做了不必要的循环,且可以更直接地定位目标节点。修正后直接通过节点层级访问目标节点,同时增加存在性判断避免报错。
问题2:保存后XML丢失换行格式
使用OuterXml输出的是无格式的压缩字符串,改用XmlDocument的Save()方法,并开启空白保留设置,即可自动保留缩进和换行。
修正后的完整代码
$file = "Path of xml file with content as mentioned above" Get-ChildItem $file | ForEach-Object { # 初始化XML文档并保留空白格式 $xml = New-Object System.Xml.XmlDocument $xml.PreserveWhitespace = $true $xml.Load($_.FullName) # 创建并添加password节点 $passwordNode = $xml.CreateElement('password') $passwordNode.InnerText = 'unencryptedpwd' $xml.'jdbc-data-source'.'jdbc-driver-params'.AppendChild($passwordNode) | Out-Null # 定位并移除password-encrypted节点 $encryptedNode = $xml.'jdbc-data-source'.'jdbc-driver-params'.'password-encrypted' if ($encryptedNode) { $xml.'jdbc-data-source'.'jdbc-driver-params'.RemoveChild($encryptedNode) | Out-Null } # 保存XML文件,自动维持格式 $xml.Save($_.FullName) }
关键修改说明
- 加载XML时保留空白:设置
$xml.PreserveWhitespace = $true,确保原有缩进和换行被保留 - 直接访问节点:通过
$xml.'jdbc-data-source'.'jdbc-driver-params'.'password-encrypted'直接定位目标节点,比XPath更直观 - 节点存在性判断:添加
if ($encryptedNode)避免节点不存在时抛出异常 - 使用Save方法保存:
XmlDocument.Save()会自动按照格式化后的结构写入文件,解决格式丢失问题
内容的提问来源于stack exchange,提问作者Vikas
相关产品推荐
相关产品推荐

