我正在使用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>
提前致谢。
答案 0 :(得分:2)
RemoveAll()
从所选节点中删除所有内容。你想要做的是删除整个节点。
如果你使用
foreach($node in $xml.gameList.game | Where-Object {$_.path -clike "*.SMC")}
要获取节点,您可以使用$xml.gameList.RemoveChild($node)
删除它。
此外,您应该使用-clike
而不是-like
,因为-like
会对不区分大小写进行比较,并且会匹配.smc和.SMC。