หากมีการเรียกใช้เมธอด Beautify ข้างต้นสำหรับโหนดลูกที่มีโหนดลูกXmlDocument
อยู่แล้วจะมีXmlProcessingInstruction
ข้อยกเว้นต่อไปนี้:
ไม่สามารถเขียนการประกาศ XML เมธอด WriteStartDocument ได้เขียนไว้แล้ว
นี่คือเวอร์ชันดั้งเดิมที่ฉันแก้ไขเพื่อกำจัดข้อยกเว้น:
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();
}
}
ตอนนี้ใช้ได้ผลสำหรับฉันแล้วคุณอาจต้องสแกนโหนดลูกทั้งหมดสำหรับXmlProcessingInstruction
โหนดไม่ใช่แค่โหนดแรก
อัปเดตเมษายน 2558:
เนื่องจากฉันมีอีกกรณีหนึ่งที่การเข้ารหัสผิดฉันจึงค้นหาวิธีบังคับใช้ UTF-8 โดยไม่มี BOM ฉันพบโพสต์บล็อกนี้และสร้างฟังก์ชันตาม:
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;
}
}