在行尾添加/在我的XML中

时间:2016-08-11 11:10:48

标签: powershell

我有一个看起来像这样的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 
} 

1 个答案:

答案 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