powershell - заменить символы между узлами xml

У меня есть XML-файл, который мне нужен для замены некоторых символов на обратную косую черту - приложение, которое принимает XML, нуждается в нем по разным причинам.

Так что мне нужно сделать следующие chnages "чтобы быть замененным \" обратной косой чертой \, чтобы быть замененным \ form feed, чтобы быть замененным \ f новой строкой, которая должна быть заменена \ n переводом каретки, который будет заменен вкладкой \ r, которая будет заменена на \ t Backspace будет заменен на \ 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 ответ

Решение

Значения узла XML относятся к типу String. Вы можете просто использовать метод.Replace().

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

Также Powershell интерпретирует выражения как &quot; если вы читаете содержимое файла как XML.

Другие вопросы по тегам