2017-05-19 2 views
0

Ich habe eine XML-Datei, die ich vor dem Ersetzen bestimmter Zeichen mit einem umgekehrten Schrägstrich ersetzen muss - die App, die das XML braucht es aus verschiedenen Gründen.Powershell - Ersetzen von Zeichen zwischen XML-Knoten

Also muss ich die folgenden chnages " tun, indem \ " Backslash \ ersetzt werden durch \ Formularvorschub ersetzt werden durch \ f Newline ersetzt werden durch \ n Wagenrücklauf ersetzt werden sein ersetzt durch \ r Registerkarte ersetzt werden \ t Rücktaste durch \ b

ersetzt werden, so sieht ein sehr einfaches XML-Snippet so aus.

<?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> 

Was ich bisher versucht habe (basierend auf GC mit einem Ersatz tut) scheint nicht zu funktionieren.

$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") 
} 

Ich habe auch versucht, es mit einem Auswahlknoten zu tun, aber das hat auch nicht funktioniert.

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

Antwort

1

XML-Knotenwerte stammen vom Typ String. Sie können einfach die .Replace() Methode verwenden.

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

Auch interpretiert Powershell Ausdrücke wie &quot; wenn Sie Datei-Inhalt als XML lesen.