no he encontrado una manera de utilizar XmlWriter de .NET y XmlWriterSettings asociados para dar formato a una cadena XML en forma de sangría exactamente la forma en que Visual Studio lo hace con su auto comando de formato (Ctrl-E Ctrl-D, o, dependiendo de la asignación del teclado, Ctrl-K Ctrl-D).programación formato XML en forma de sangría tal como auto-formato de Visual Studio
me gustaría hacer esto porque habitualmente auto-formato de todos mis archivos en VS, el código y los archivos .config. Tengo una aplicación de instalación que actualiza los archivos .config, y me gustaría ver diferencias reales en lugar de cambiar todo el documento.
No he explorado todas las diferentes opciones de formato para el auto-formato, pero me gusta que cada atributo XML esté en una línea separada, con el primero en la misma línea que la etiqueta de apertura y los posteriores alineados con el en primer lugar, como esto:
<asset assetId="12345"
bucket="default"
owner="nobody">
<file path="\\localhost\share\assetA.mov"/>
<metadata metadataId="23456"
key="asset_type"
value="video"/>
</asset>
he intentado formatear con propiedades XmlWriterSettings 'NewLineHandling = NewLineHandling.None' y 'NewLineOnAttributes = true', pero que pone el primer atributo debajo de la etiqueta de apertura y todos los atributos tienen el mismo muesca independientemente del # de caracteres en el nombre del elemento, así:
<asset
assetId="12345"
bucket="default"
owner="nobody">
<file
path="\\localhost\share\assetA.mov" />
<metadata metadataId="23456"
key="asset_type"
value="video" />
</asset>
en cuenta que la norma también XmlWriter termina elementos de atributo de sólo con "> /" (espacio adicional antes de la barra), que me gusta, pero no estoy seguro si eso es el estándar XML. Creo que Visual Studio usa las mismas opciones de API disponibles para los desarrolladores, pero aún no he encontrado esas configuraciones mágicas. De todos modos, aquí está mi método de formato:
public static string FormatXml(string xmlString, bool indented)
{
using (TextReader textReader = new StringReader(xmlString))
using (XmlReader xmlReader = new XmlTextReader(textReader))
{
using (TextWriter textWriter = new StringWriter())
{
var settings = new XmlWriterSettings();
if (indented)
{
settings.Indent = true;
settings.IndentChars = " ";
settings.NewLineOnAttributes = true;
settings.NewLineHandling = NewLineHandling.None;
}
using (var xmlWriter = XmlWriter.Create(textWriter, settings))
{
while (xmlReader.Read())
xmlWriter.WriteNode(xmlReader, false);
}
return textWriter.ToString();
}
}
}
No está ahí. –