如何用PowerShell根据XML的property子节点name值替换对应value内容
正确实现代码
方案1:XPath直接定位目标value节点(最简洁)
直接通过XPath语法筛选出name为指定值的property节点下的value子节点,一步到位修改:
$file = "site.xml" $xml = New-Object XML $xml.Load($file) # 直接定位到name为access.key的property对应的value节点 $targetNode = $xml.SelectSingleNode("/configuration/property[name='access.key']/value") $targetNode.InnerText = "{{ access_key }}" $xml.Save($file)
如果需要修改多个配置项,只要复用这个XPath逻辑替换匹配的name值即可。
方案2:遍历property节点修改
如果你需要批量处理多个property节点,也可以用遍历的写法,注意直接访问子元素而非属性:
$file = "site.xml" $xml = New-Object XML $xml.Load($file) $nodes = $xml.SelectNodes('/configuration/property') foreach ($node in $nodes) { # 访问name子元素的文本值判断,而非属性 if ($node.name.InnerText -eq 'access.key') { # 修改同级value子元素的文本值 $node.value.InnerText = '{{ access_key }}' } } $xml.Save($file)
之前写法的问题说明
- 第一种错误是混淆了XML元素和属性,
name和value都是property的子元素,不是属性,不能通过Attributes集合访问 - 第二种错误是XPath选中了
name节点本身,修改就会直接改掉name的取值,没有定位到需要修改的同级value节点
内容的提问来源于stack exchange,提问作者munchine
相关产品推荐
相关产品推荐

