Jeśli powyższa metoda Beautify jest wywoływana dla elementu, XmlDocument
który już zawiera XmlProcessingInstruction
węzeł podrzędny, generowany jest następujący wyjątek:
Nie można zapisać deklaracji XML. Metoda WriteStartDocument już go zapisała.
To jest moja zmodyfikowana wersja oryginalnej, aby pozbyć się wyjątku:
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();
}
}
U mnie teraz działa, prawdopodobnie musiałbyś przeskanować wszystkie węzły potomne XmlProcessingInstruction
, a nie tylko pierwszy?
Aktualizacja kwiecień 2015:
Ponieważ miałem inny przypadek, w którym kodowanie było nieprawidłowe, szukałem sposobu na wymuszenie UTF-8 bez BOM. Znalazłem ten post na blogu i utworzyłem na jego podstawie funkcję:
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;
}
}