2011-06-01 18 views
9

puedo crear un XmlDocument así:Guardar bien formado XML desde PowerShell

$doc = New-Object xml 

Entonces, después de llenarlo con los nodos, lo guardo:

$doc.Save($fileName) 

El problema es que no lo hace agregue la declaración XML al principio del documento, lo que da como resultado un documento con formato incorrecto. En otras palabras, solo guarda un fragmento. ¿Cómo puedo agregarle una declaración XML correcta?

+3

FYI la falta de una declaración XML no hace ma ke es un archivo XML mal formado ya que no es un elemento obligatorio. –

Respuesta

11

Debe usar la clase XmlTextWriter para formatear la salida. Este es un ejemplo, aunque es posible que desee evolucionar para las necesidades específicas que tiene más allá de la adición de la cabecera:

$doc = [xml]"<html>Value</html>" 
$sb = New-Object System.Text.StringBuilder 
$sw = New-Object System.IO.StringWriter($sb) 
$writer = New-Object System.Xml.XmlTextWriter($sw) 
$writer.Formatting = [System.Xml.Formatting]::Indented 
$doc.Save($writer) 
$writer.Close() 
$sw.Dispose() 

Más tarde, llamando al método ToString en el objeto StringBuilder, se puede ver el siguiente resultado:

PS C:\> $sb.ToString() 
<?xml version="1.0" encoding="utf-16"?> 
<html>Value</html> 
+0

Me encontré con un problema con esto si la etiqueta html tenía un tipo de documento de transición. El html no se pudo analizar en un documento xml válido. – Wade

+0

Si bien este enfoque funciona, usar los métodos XML integrados en powershell es una mejor solución general. – Ryanman

14

O puede utilizar el método CreateXmlDeclaration en XmlDocument por ejemplo:

$doc = new-object xml 
$decl = $doc.CreateXmlDeclaration("1.0", $null, $null) 
$rootNode = $doc.CreateElement("root"); 
$doc.InsertBefore($decl, $doc.DocumentElement) 
$doc.AppendChild($rootNode); 
$doc.Save("C:\temp\test.xml") 
+0

puede agregar $ decl con $ doc.AppendChild también –

Cuestiones relacionadas