powershell - 替换xml节点之间的字符

时间:2017-05-19 07:59:59

标签: xml powershell replace selectnodes

我有一个xml文件,我需要预先用反斜杠替换某些字符 - 由于各种原因需要xml的应用程序。

所以我需要做以下几个方面 "被\"取代 反斜杠\将被替换为\ 换页器由\ f替换 换行符由\ n替换 回车被\ r \ n替换 选项卡由\ t替换 退格键由\ b

替换

所以一个非常简单的xml片段看起来像这样。

<?xml version="1.0" encoding="UTF-8"?>
      <ContactDetailsRow num="1">
        <Notes>This a test for special characters that need to be replaced
Ampersand - &amp;
Double Quote - &quot;
Forward Slash - /
Back Slash - \
Less Than - &lt;
Greater Than - &gt;
Question Mark - ?
Tab     </Notes>
      </ContactDetailsRow>

到目前为止我所尝试的(基于带有替换的GC)似乎不起作用。

$path = "C:\Dump\TEST"
$Files = Get-Childitem -path $path -File -include testfile*.xml -name

foreach ($File in $Files)
{
    write-host "=== FILE is $File ===" -ForegroundColor "White"
    $xml = [xml](Get-Content $path\$File)

    $xml.ContactDetailsRow.Notes = $xml.ContactDetailsRow.Notes -replace '&quot;', '\&quot;'   #doubel quote
    $xml.ContactDetailsRow.Notes = $xml.ContactDetailsRow.Notes -replace '`n;', '`\n'          #newline
    $xml.ContactDetailsRow.Notes = $xml.ContactDetailsRow.Notes -replace '`f' , '`\f'          #form feed
    $xml.ContactDetailsRow.Notes = $xml.ContactDetailsRow.Notes -replace '`r' , '`\r'          #carriage return
    $xml.ContactDetailsRow.Notes = $xml.ContactDetailsRow.Notes -replace '`t' , '`\t'          #tab
    $xml.ContactDetailsRow.Notes = $xml.ContactDetailsRow.Notes -replace '`b' , '`\b'          #backspace
    $xml.ContactDetailsRow.Notes = $xml.ContactDetailsRow.Notes -replace '`\' , '`\\'           #back slash
    write-host $xml.ContactDetailsRow.Notes

    $xml.Save("$path\$File")
}   

我也尝试用一个选择节点来做,但这也没有用。

$xml.SelectNodes('//text()') | ForEach-Object {  
    $_.Value = ($_.Value -replace "&quot;" , "\&quot;")
}

1 个答案:

答案 0 :(得分:1)

XML节点值来自String类型。 你可以使用.Replace()方法。

$xml.ContactDetailsRow.Notes = $xml.ContactDetailsRow.Notes.Replace("`t" , '\t')

如果您将文件内容读作XML,Powershell也会解释像&quot;这样的表达式。