如何使用PowerShell有条件删除XML子节点并修改节点属性值
解决方案
你需要先把不符合条件的节点筛选出来存入独立集合后再执行删除操作,避免遍历原节点集合时修改集合结构导致遍历异常,完整可运行代码如下:
$urlWebSite = 'prod.local' $siteName = @('t100001','t100002','t100003') # 加载XML配置文件 [xml]$config = Get-Content("path\xml.config") $tenantsRoot = $config.Tenant.Tenants # 筛选所有siteName不在白名单内的Tenant节点,转成独立数组避免后续删除操作影响遍历 $nodesToRemove = $tenantsRoot.ChildNodes | Where-Object { # 加NodeType判断可避免误删注释、空白节点等非元素节点,不需要可以删掉 $_.NodeType -eq 'Element' -and $siteName -notcontains $_.siteName } # 遍历删除所有不符合条件的节点 foreach ($delNode in $nodesToRemove) { # Out-Null用于屏蔽RemoveChild方法的默认返回输出,不需要可以去掉 $tenantsRoot.RemoveChild($delNode) | Out-Null } # 更新剩余所有Tenant节点的urlWebSite属性 foreach ($tenantNode in $tenantsRoot.ChildNodes) { $tenantNode.urlWebSite = $urlWebSite } # 保存修改后的配置 $config.Save("path\xml.config")
核心逻辑说明
- 不能直接在遍历
$config.Tenant.Tenants.ChildNodes的循环中删除节点:删除操作会动态修改节点集合的结构,会导致遍历出现遗漏、索引错位甚至报错 - 先把需要删除的节点筛选到独立数组中,再遍历删除,就不会受原集合结构变化的影响
内容的提问来源于stack exchange,提问作者Orest Gulman
相关产品推荐
相关产品推荐

