2009-04-15 13 views

risposta

14

Questo potrebbe non essere il più ottimale, ma funziona. Basta caricare l'xml e reinserirlo in un file. l'intestazione xml è persa, quindi questo deve essere aggiunto nuovamente.

$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

Non dovresti impostare esplicitamente la codifica per salvare da qualche parte? – Joey

+0

Se sapessi come, lo farei. Tuttavia, sembra essere l'impostazione predefinita. –

+0

-Parametro di codifica. – JasonMArcher

13

Beh, credo che il modo più semplice è quello di non solo preoccuparsi se il file è XML o meno e semplicemente convertire:

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

Questo funziona solo per XML quando non c'è

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

linea.

+4

Se si desidera eseguire l'operazione senza creare un nuovo file, è possibile racchiudere tra parentesi il contenuto get: (Get-Content File.foo) | Set-Content -Encoding UTF8 File.foo – Jaykul

+0

Come si fa per i file in una directory e sottodirectory? – stormwild

+1

'gci -rec -fi * | % {(gc $ _ -enc unicode) | set-content -enc utf8 $ _. fullname} '. Abbastanza semplice, in realtà. – Joey

8

Prova questa soluzione che utilizza un XmlWriter:

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

Si consiglia di guardare XMLDocument maggiori spiegazioni su CreateXmlDeclaration.

+0

Grazie mille per la cura di fornire una risposta così breve, tecnicamente migliore, a una domanda così vecchia! – gimpf

+0

Ho dovuto farlo e ho trovato questa soluzione ancora prima di vedere questa domanda. Sentivo che era normale offrirlo. Con poco sforzo, qualcuno può persino usarlo per copiare durante la conversione della codifica dei file. Saluti. – LMA1980