我有一个看起来像这样的XML文件(我的文件中有更多的文件标签):
<file
name="YYY/xxxx/xyz/zyx.cs"
count = '15'>
<severity level="0" count="4"/>
<severity level="2" count="11"/>
<source name="ReviewLinqMethodRule" count="1"/>
<source name="AvoidRepetitiveCallsToPropertiesRule" count="3"/>
<source name="AvoidUnnecessarySpecializationRule" count="3"/>
<source name="CheckParametersNullityInVisibleMethodsRule" count="4"/>
<source name="PreferEmptyInstanceOverNullRule" count="2"/>
<source name="AvoidRepetitiveCastsRule" count="2"/>
</file>
我想要一个搜索整个文件的PowerShell代码,每次找到name=
时,链接都应该更改为完全相同,除非应该将/
添加到最后。
所以这个
name="YYY/xxxx/xyz/zyx.cs"
应更改为此
name="YYY/xxxx/xyz/zyx.cs"
所以上面看起来像这样:
<file
name="YYY/xxxx/xyz/zyx.cs/"
count = '15'>
<severity level="0" count="4"/>
<severity level="2" count="11"/>
<source name="ReviewLinqMethodRule" count="1"/>
<source name="AvoidRepetitiveCallsToPropertiesRule" count="3"/>
<source name="AvoidUnnecessarySpecializationRule" count="3"/>
<source name="CheckParametersNullityInVisibleMethodsRule" count="4"/>
<source name="PreferEmptyInstanceOverNullRule" count="2"/>
<source name="AvoidRepetitiveCastsRule" count="2"/>
</file>
它需要通过孔文件并查找所有name=
。链接将永远不会相同。
有一种简单的方法吗?
我到目前为止所以我可以打印出每个元素:
[xml]$XML = Get-Content -Path violations.xml
foreach( $file in $XML.violations.type.file)
{
Write-Host $file.name
}
答案 0 :(得分:2)
这样的东西?
[xml]$XML = Get-Content -Path $file_path
$XML.file.name = $XML.file.name + "/"
# then you can save it on the same file with
$XML.Save($file_path)
在OP编辑之后。
您应该尝试使用regex
,但这是原始解决方案:
$i = 0;
$xml = Get-Content -Path $file_path
foreach($line in $xml){
if(($line -like "*name=*") -and ($line -like '*"*/*"*')){
$temp += $line.Split('"')[0] + '"' + $line.Split('"')[1] + '/"'
} else {
$temp += $line
}
$i++
}
[xml]$xml = $temp