我有一个包含字符串的列表,对于每一行,XML文件中都有一个对应节点。需要删除该XML中的所有父级。脚本大致正常工作,但结果不正确。我在Xpath查询中遇到一些关于变量$line
的错误。我正在努力弄清楚这个变量到底发生了什么。
romlist.txt:
1941.zip
llander.zip
warrior.zip
gamelist.xml:
<?xml version="1.0" encoding="UTF-8"?>
<gameList>
<game id="46415" source="screenscraper.fr">
<path>.aaa/bbb/warrior.zip</path>
<name>Warrior</name>
<desc>qweqwe</desc>
<image>./images/warrior-image.png</image>
<rating>0.7</rating>
<releasedate>19790101T000000</releasedate>
<developer>Tim Skelly</developer>
<publisher>Vectorbeam</publisher>
<genre>Fight / N/A</genre>
<players>2</players>
<video>./videos/warrior-video.mp4</video>
</game>
<game id="39873" source="screenscraper.fr">
<path>.ccc/ddd/1941.zip</path>
<name>1941 - Counter Attack</name>
<desc>asdasd</desc>
<image>./images/1941-image.png</image>
<rating>0.8</rating>
<releasedate>19900101T000000</releasedate>
<developer>Capcom</developer>
<publisher>Capcom</publisher>
<genre>Shoot'em up / Vertical / Shoot'em Up</genre>
<players>2</players>
<video>./videos/1941-video.mp4</video>
</game>
<game id="46408" source="screenscraper.fr">
<path>.eee/fff/sundance.zip</path>
<name>Sundance</name>
<desc>zxczxc</desc>
<image>./images/sundance-image.png</image>
<rating>0.5</rating>
<releasedate>19790101T000000</releasedate>
<developer>Tim Skelly</developer>
<publisher>Cinematronics</publisher>
<genre>N/A / Various</genre>
<players>2</players>
<video>./videos/sundance-video.mp4</video>
</game>
<game id="46393" source="screenscraper.fr">
<path>.ggg/hhh/llander.zip</path>
<name>Lunar Lander</name>
<desc>asdasd</desc>
<image>./images/llander-image.png</image>
<rating>0.9</rating>
<releasedate>19790101T000000</releasedate>
<developer>Atari</developer>
<publisher>Atari</publisher>
<genre>Various / N/A / Simulation</genre>
<players>1</players>
<video>./videos/llander-video.mp4</video>
</game>
</gameList>
POWERSHELL:
$input = "gamelist.xml"
$output = "gamelist_result.xml"
$romlist = "romlist.txt"
[xml]$xml = Get-Content -Path $input -Raw
ForEach($line in Get-Content $romlist) {
$rom = $xml.selectSingleNode('//game/path[contains(text(),line)]') | Select-Object -ExpandProperty "#text"
ForEach($node in $xml.gameList.game | Where-Object {$_.path -eq $rom})
{
$xml.gameList.RemoveChild($node)
}
}
$path = (join-path $pwd $output)
$xml.Save($path)
如果为$xml.selectSingleNode('//game/path[contains(text(),line)]')
,我们没有错误,但结果是错误的。
如果为$xml.selectSingleNode('//game/path[contains(text(),$line)]')
,我们有一些错误,结果是颠倒的,其中列表被保留而不是被删除。
如果能帮我解决这个问题,我将不胜感激
发布于 2018-06-24 23:07:33
如果我没弄错的话。
$rom, $inp = 'C:\path\romlist.txt', 'C:\path\gamelist.xml'
($lst, $xml = (Get-Content $rom), [xml](Get-Content $inp))[0].ForEach{
$nod = $xml.SelectSingleNode("//path[contains(text(), '$_')]")
[void]$xml.gameList.RemoveChild($nod.ParentNode)
}
$xml.Save('C:\path\gamelist_result.xml')
发布于 2018-06-24 23:46:11
您的代码几乎是正确的,但是这一行有一个问题:
$xml.selectSingleNode('//game/path[contains(text(),line)]')
如果您希望Powershell用它的值替换line
,那么可以使用外部双引号和$
。还需要在$line
两边添加文字单引号,因为函数contains
需要它们来定界值。
$xml.selectSingleNode("//game/path[contains(text(),'$line')]")
有了这样的改变,它应该可以工作了。不过,我对其余部分进行了一些重构,使其更加简洁。
ForEach($line in Get-Content $romlist) {
$rom = $xml.selectSingleNode("//game/path[contains(text(),'$line')]") | Select-Object -ExpandProperty "#text"
$xml.gameList.ChildNodes | Where-Object{ $_.path -eq $rom } | ForEach-Object { $xml.gameList.RemoveChild($_) }
}
https://stackoverflow.com/questions/51010491
复制相似问题