如何根据特定节点的键值删除该节点



任务是根据键或值删除节点,例如,应该删除带有键"org.quartz.B"和value="BBB"的整个条目。

<config>
 <module>
   <section name="java">
    <entry key="org.quartz.A" value="AAA" />
    <entry key="org.quartz.B" value="BBB" />
    <entry key="org.quartz.C" value="CCC" />
    <entry key="org.quartz.D" value="false" />
   </section>
    <section name="db">
    <entry key="oracle" value="12" />
    <entry key="mssql" value="2012" />
    <entry key="mysql" value="6.1" />       
   </section>
 </module>
</config>

我尝试过的代码是

$getxmlpath="C:test.xml"
$xml=[xml](Get-Content $getxmlpath)
Write-Host ($xml)
$javasection = $xml.config.module | where-Object {$_.name -eq 'java'}
Write-Host ($javasection)
####### dont know how to delete particular node#######
$xml.Save($getxmlpath)

您可以使用 XmlNode 类的 RemoveChild 方法:

$childToRemove = $javaSection.entry | ? { $_.Key -eq 'org.quartz.B' }
$javaSection.RemoveChild($childToRemove)

请注意,使用它来查找要删除的元素效率低下,因为它必须使用 Where-Object cmdlet 筛选所有元素。如果您的 xml 要很大,您可能需要考虑将 XPath 表达式与以下方法结合使用:SelectSingleNode。

我建议使用XPath表达式来查找匹配的节点:

$XPath = '//section[@name = "java"]/entry[@key = "org.quartz.B" and @value = "BBB"]'
$Nodes = $xml.SelectNodes($XPath)

然后,为了从文档中删除它们,您需要在每个节点的父节点上调用RemoveChild()

foreach($Node in $Nodes)
{
    # RemoveChild() will return the child $Node 
    # We don't need it anymore, assign to $null
    $null = $Node.ParentNode.RemoveChild($Node)
}
# Save $xml
$xml.Save("C:output.xml")

最新更新