2009-04-15 12 views

Respuesta

14

Esto puede no ser el más óptimo, pero funciona. Simplemente cargue el xml y vuelva a colocarlo en un archivo. sin embargo, se pierde el encabezado xml, por lo que debe volverse a agregar.

$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

¿No debería configurar explícitamente la codificación para guardar en alguna parte? – Joey

+0

Si supiera cómo, lo haría. Aunque parece ser el predeterminado. –

+0

-Elemento de codificación. – JasonMArcher

13

Bueno, supongo que la forma más fácil es simplemente no se preocupan por si el archivo es XML o no y simplemente convertir:

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

Esto sólo funcionará para XML cuando no hay

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

línea.

+4

Si desea hacerlo sin crear un archivo nuevo, puede envolver el contenido get entre paréntesis: (Get-Content File.foo) | Set-Content -Encoding UTF8 File.foo – Jaykul

+0

¿Cómo se hace esto para los archivos en un directorio y subdirectorios? – stormwild

+1

'gci -rec -fi * | % {(gc $ _ -enc unicode) | set-content -enc utf8 $ _. fullname} '. Bastante sencillo, en realidad. – Joey

8

Revise la solución que utiliza una 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)  
} 

Es posible que desee ver en XMLDocument para una explicación más detallada sobre CreateXmlDeclaration.

+0

¡Muchas gracias por preocuparse por proporcionar una respuesta tan breve y técnicamente mejor a una pregunta tan antigua! – gimpf

+0

Tuve que hacerlo y encontré esta solución incluso antes de ver esta pregunta. Sentí que era normal ofrecerlo. Con poco esfuerzo, alguien incluso puede usarlo para copiar mientras convierte la codificación de los archivos. Saludos. – LMA1980