Powershell:在XML节点中搜索文件扩展名并删除父节点

时间:2017-05-29 04:03:23

标签: xml powershell

我正在使用powershell对复古pi游戏列表进行一些清理,但我仍然坚持使用xml的语法。 目标是删除特定文件扩展名类型的所有游戏条目。

列表格式如下:

    <?xml version="1.0"?>
<gameList>
    <game id="" source="">
        <path>./2020 Super Baseball (USA).SMC</path>
        <name>2020 Super Baseball</name>
        <desc />
        <image>./boxart/2020 Super Baseball (USA).png</image>
        <marquee>./wheel/2020 Super Baseball (USA).png</marquee>
        <video>./snap/2020 Super Baseball (USA).mp4</video>
        <releasedate />
        <developer />
        <publisher />
        <genre />
    </game>
    <game id="" source="">
        <path>./2020 Super Baseball (USA).smc</path>
        <name>2020 Super Baseball</name>
        <desc />
        <image>./boxart/2020 Super Baseball (USA).png</image>
        <marquee>./wheel/2020 Super Baseball (USA).png</marquee>
        <video>./snap/2020 Super Baseball (USA).mp4</video>
        <releasedate />
        <developer />
        <publisher />
        <genre />
    </game>
</gameList>

每个游戏都有.smc和.SMC条目,我希望删除.SMC

到目前为止,我已经能够遍历文件并删除路径中包含.SMC扩展名的每个游戏节点的内容。

# Load the existing document
[xml]$xml = Get-Content "snes-gamelist.xml"

#Iterate through each game node
ForEach($Path in $xml.gamelist.game.path | Where-Object  {$_ -like "*.SMC"}) 
{

$xml.SelectsingleNode("//path[.='"+$Path+"']") | % { 
$_.ParentNode.RemoveAll() }

}

#Output
$xml.save("MOD-snes-gamelist.xml")

问题是实际的游戏节点仍然落后,我不知道如何完全删除它。

 <?xml version="1.0"?>
<gameList>
    <game>
    </game>
    <game id="" source="">
        <path>./2020 Super Baseball (USA).smc</path>
        <name>2020 Super Baseball</name>
        <desc />
        <image>./boxart/2020 Super Baseball (USA).png</image>
        <marquee>./wheel/2020 Super Baseball (USA).png</marquee>
        <video>./snap/2020 Super Baseball (USA).mp4</video>
        <releasedate />
        <developer />
        <publisher />
        <genre />
    </game>
</gameList>

提前致谢。

1 个答案:

答案 0 :(得分:2)

RemoveAll()从所选节点中删除所有内容。你想要做的是删除整个节点。

如果你使用 foreach($node in $xml.gameList.game | Where-Object {$_.path -clike "*.SMC")}要获取节点,您可以使用$xml.gameList.RemoveChild($node)删除它。

此外,您应该使用-clike而不是-like,因为-like会对不区分大小写进行比较,并且会匹配.smc和.SMC。