Nếu phương thức Beautify ở trên đang được gọi cho một phương thức XmlDocument
đã chứa một XmlProcessingInstruction
nút con thì ngoại lệ sau sẽ được ném ra:
Không thể viết khai báo XML. Phương thức WriteStartDocument đã viết nó.
Đây là phiên bản đã sửa đổi của tôi so với phiên bản gốc để loại bỏ ngoại lệ:
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();
}
}
Nó hoạt động với tôi bây giờ, có lẽ bạn sẽ cần phải quét tất cả các nút con cho XmlProcessingInstruction
nút, không chỉ nút đầu tiên?
Cập nhật tháng 4 năm 2015:
Vì tôi đã gặp một trường hợp mã hóa sai khác, tôi đã tìm kiếm cách thực thi UTF-8 mà không cần BOM. Tôi đã tìm thấy bài đăng trên blog này và tạo một chức năng dựa trên nó:
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;
}
}