複数に散らばるxmlの共通部分を消したい。
PowerShellでdiff的なことができるCompare-Object
は便利だけど、
xmlなんだしそのまま比較して消しゃええやんというわけで書きました
<?xml version="1.0"?>
<hogehoge>
<fugafuga name="one">いち</message>
<fugafuga name="two">に</message>
<fugafuga name="three">さん</message>
</hogehoge>
<?xml version="1.0"?>
<hogehoge>
<fugafuga name="ichi">いち</message>
<!-- attributeとテキストが一致するこやつだけを消したい! -->
<fugafuga name="two">に</message>
<fugafuga name="three">スリー</message>
</hogehoge>
こちらごらんください。
function RemoveCommonNodes($targetPath, $commonPath){
# xmlを取得
# ちゃんとエンコードは入れましょう、文字化けでエラーを吐きました
$targetXml = [xml](Get-Content -Encoding UTF8 $targetPath)
$commonXml = [xml](Get-Content -Encoding UTF8 $commonPath)
$commonXml.hogehoge.fugafuga | ForEach-Object{
# いろいろこねくり回しましたが、結局xpathを使うのが書きやすい気がします
$targetNode = $targetXml.SelectSingleNode("//fugafuga[@name = '$($_.name)']")
if($targetNode){
if($targetNode.'#text' -eq $_.'#text')
{
# 自分自身を削除
$targetNode.OwnerDocument.DocumentElement.RemoveChild($targetNode)
}
}
}
# 保存も忘れず
$targetXml.Save($targetPath)
}
参考