2009-04-15 10 views

Antwort

14

Dies ist vielleicht nicht optimal, aber es funktioniert. Laden Sie einfach das XML und drücken Sie es wieder in eine Datei. Die XML-Überschrift ist jedoch verloren, also muss diese neu hinzugefügt werden.

$files = get-ChildItem "*.xml" 
foreach ($file in $files) 
{ 
    [System.Xml.XmlDocument]$doc = new-object System.Xml.XmlDocument; 
    $doc.set_PreserveWhiteSpace($true); 
    $doc.Load($file); 

    $root = $doc.get_DocumentElement(); 
    $xml = $root.get_outerXml(); 
    $xml = '<?xml version="1.0" encoding="utf-8"?>' + $xml 

    $newFile = $file.Name + ".new" 
    Set-Content -Encoding UTF8 $newFile $xml; 
} 
+0

Sollten Sie die Codierung nicht explizit festlegen, um irgendwo zu speichern? – Joey

+0

Wenn ich wüsste wie, würde ich. Es scheint jedoch der Standard zu sein. –

+0

-Encoding-Parameter. – JasonMArcher

13

Nun, ich denke, der einfachste Weg ist, nur um es egal, ob die Datei XML ist oder nicht, und einfach konvertieren:

Get-Content file.foo -Encoding Unicode | Set-Content -Encoding UTF8 newfile.foo 

Dies wird nur für XML arbeiten, wenn es keine

<?xml version="1.0" encoding="UTF-16"?> 

Linie.

+4

Wenn Sie dies tun möchten, ohne eine neue Datei zu erstellen, können Sie den Get-Inhalt in Klammern umwandeln: (Get-Content File.foo) | Set-Content -Encoding UTF8 File.foo – Jaykul

+0

Wie machen Sie das für Dateien in einem Verzeichnis und in Unterverzeichnissen? – stormwild

+1

'gci -rec -fi * | % {(gc $ _ -enc Unicode) | set-content -enc utf8 $ _. fullname} '. Ziemlich einfach, eigentlich. – Joey

8

Versuchen Sie, diese Lösung, die eine XmlWriter verwendet:

$encoding="UTF-8" # most encoding should work 
$files = get-ChildItem "*.xml" 
foreach ($file in $files) 
{ 
    [xml] $xmlDoc = get-content $file 
    $xmlDoc.xml = $($xmlDoc.CreateXmlDeclaration("1.0",$encoding,"")).Value 
    $xmlDoc.save($file.FullName)  
} 

Sie können bei XMLDocument für weitere Erklärung auf CreateXmlDeclaration suchen.

+0

Vielen Dank, dass Sie sich darum gekümmert haben, solch eine kurze, technisch bessere Antwort auf solch eine alte Frage zu geben! – gimpf

+0

Ich musste es schaffen und ich fand diese Lösung noch bevor ich diese Frage sah. Ich hielt es für normal, es anzubieten. Mit wenig Aufwand kann es sogar jemand zum Kopieren verwenden, während die Kodierung der Dateien konvertiert wird. Grüße. – LMA1980