Cuando construyo XML desde cero con XmlDocument
, la OuterXml
propiedad ya tiene todo bien sangrado con saltos de línea. Sin embargo, si llamo LoadXml
a un XML muy "comprimido" (sin saltos de línea o sangría), la salida de OuterXml
permanecerá así. Entonces ...
¿Cuál es la forma más sencilla de obtener una salida XML embellecida a partir de una instancia de XmlDocument
?
c#
.net
xmldocument
outerxml
Neil C. Obremski
fuente
fuente
settings.Encoding = Encoding.UTF8;
MemoryStream
+StreamWriter
con una codificación especificada en lugar deStringBuilder
, y obteniendo el texto conenc.GetString(memstream.GetBuffer(), 0, (int)memstream.Length);
. Sin embargo, el resultado final todavía no está formateado. ¿Podría estar relacionado con que estoy comenzando desde un documento leído que ya tiene formato? Solo quiero que mis nuevos nodos también estén formateados."\r\n"
aEnvironment.Newline
.doc.PreserveWhitespace
no debe establecerse en verdadero. De lo contrario, falla si ya contiene una sangría parcial.Adaptado del blog de Erika Ehrli , esto debería hacerlo:
fuente
using
declaración cerrará automáticamente el escritor cuandoDispose()
se llame.O incluso más fácil si tiene acceso a Linq
fuente
<?xml ...?>
y el<!DOCTYPE ...>
del XML. Está bien para un fragmento, pero no es deseable para un documento completo.Una versión de método de extensión más corta
fuente
Si se llama al método Beautify anterior para un nodo
XmlDocument
que ya contiene unXmlProcessingInstruction
nodo secundario, se lanza la siguiente excepción:Esta es mi versión modificada de la original para deshacerme de la excepción:
Funciona para mí ahora, probablemente necesitaría escanear todos los nodos secundarios para el
XmlProcessingInstruction
nodo, no solo el primero.Actualización de abril de 2015:
Como tuve otro caso en el que la codificación era incorrecta, busqué cómo hacer cumplir UTF-8 sin BOM. Encontré esta publicación de blog y creé una función basada en ella:
fuente
Encoding = Encoding.UTF8
yOmitXmlDeclaration = true
fuente
fuente
Una forma sencilla es utilizar:
Al igual que este código de muestra, este código es lo que usé para crear una estructura similar a una vista de árbol usando XMLWriter:
De esta manera, puede agregar saltos de tabulación o de línea de la forma en que está acostumbrado, es decir, \ t o \ n
fuente
Al implementar las sugerencias publicadas aquí, tuve problemas con la codificación del texto. Parece que la codificación del
XmlWriterSettings
flujo se ignora y siempre se anula por la codificación de la secuencia. Cuando se usa aStringBuilder
, esta es siempre la codificación de texto utilizada internamente en C #, es decir, UTF-16.Así que aquí hay una versión que también admite otras codificaciones.
NOTA IMPORTANTE: El formato se ignora por completo si su
XMLDocument
objeto tiene supreserveWhitespace
propiedad habilitada al cargar el documento. Esto me dejó perplejo por un tiempo, así que asegúrese de no habilitarlo.Mi código final:
Esto guardará el xml formateado en el disco, con la codificación de texto dada.
fuente
Si tiene una cadena de XML, en lugar de un documento listo para usar, puede hacerlo de esta manera:
fuente
Un enfoque más simplificado basado en la respuesta aceptada:
No es necesario configurar la nueva línea. Los caracteres de sangría también tienen los dos espacios predeterminados, por lo que preferí no establecerlo también.
fuente