Cuando construyo XML desde cero con XmlDocument , la OuterXmlpropiedad ya tiene todo bien sangrado con saltos de línea. Sin embargo, si llamo LoadXmla un XML muy "comprimido" (sin saltos de línea o sangría), la salida de OuterXmlpermanecerá 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+StreamWritercon 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.PreserveWhitespaceno 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
usingdeclaració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
XmlDocumentque ya contiene unXmlProcessingInstructionnodo 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
XmlProcessingInstructionnodo, 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.UTF8yOmitXmlDeclaration = truefuente
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
XmlWriterSettingsflujo 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
XMLDocumentobjeto tiene supreserveWhitespacepropiedad 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