Si el método anterior Embellecer está siendo llamado para una XmlDocument
que ya contiene un nodo XmlProcessingInstruction
niño se lanza la siguiente excepción:
No se puede escribir declaración XML. El método WriteStartDocument ya lo ha escrito .
Esta es mi versión modificada de la original para deshacerse de la excepción:
private static string beautify(
XmlDocument doc)
{
var sb = new StringBuilder();
var settings =
new XmlWriterSettings
{
Indent = true,
IndentChars = @" ",
NewLineChars = Environment.NewLine,
NewLineHandling = NewLineHandling.Replace,
};
using (var writer = XmlWriter.Create(sb, settings))
{
if (doc.ChildNodes[0] is XmlProcessingInstruction)
{
doc.RemoveChild(doc.ChildNodes[0]);
}
doc.Save(writer);
return sb.ToString();
}
}
Funciona para mí ahora, probablemente, lo que se necesita para escanear todos los nodos hijos del nodo XmlProcessingInstruction
, no solo el primero?
Update Abril 2015:
Como no tenía otro caso en el que la codificación estaba mal, me buscado cómo hacer cumplir UTF-8 sin BOM. He encontrado this blog post y creé una función basada en ella:
private static string beautify(string xml)
{
var doc = new XmlDocument();
doc.LoadXml(xml);
var settings = new XmlWriterSettings
{
Indent = true,
IndentChars = "\t",
NewLineChars = Environment.NewLine,
NewLineHandling = NewLineHandling.Replace,
Encoding = new UTF8Encoding(false)
};
using (var ms = new MemoryStream())
using (var writer = XmlWriter.Create(ms, settings))
{
doc.Save(writer);
var xmlString = Encoding.UTF8.GetString(ms.ToArray());
return xmlString;
}
}
Incluso podría considerar crear su método de utilidad como un método de extensión para la clase XmlDocument. – Oppositional
¿Qué tal un bloque 'using' alrededor de' XmlWriter'? Solo para estar 100% seguro ... –
Por extraño que parezca, para mí esto no hace más que establecer la codificación del encabezado xml en UTF-16. Curiosamente, lo hace incluso si establezco explícitamente 'settings.Encoding = Encoding.UTF8;' – Nyerguds